<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Direct function</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Direct_function"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Direct_function rootpage-Direct_function skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Direct function</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">"Dfns" redirects here. For the political entity sometimes known as the Democratic Federation of Northern Syria, see <a href="Autonomous_Administration_of_North_and_East_Syria" class="mw-redirect" title="Autonomous Administration of North and East Syria">Autonomous Administration of North and East Syria</a>.</div>
<p>A <b>direct function</b> (<b>dfn</b>, pronounced "dee fun") is an alternative way to define a function and operator (a <a href="Higher-order_function" title="Higher-order function">higher-order function</a>) in the programming language <a href="APL_(programming_language)" title="APL (programming language)">APL</a>. A direct operator can also be called a <b>dop</b> (pronounced "dee op"). They were invented by <a href="John_M._Scholes" title="John M. Scholes">John Scholes</a> in 1996.<sup id="cite_ref-Scholes1996_1-0" class="reference"><a href="#cite_note-Scholes1996-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> They are a unique combination of <a href="Array_programming" title="Array programming">array programming</a>, higher-order function, and <a href="Functional_programming" title="Functional programming">functional programming</a>, and are a major distinguishing advance of early 21st century APL over prior versions.
</p><p>A dfn is a sequence of possibly <a href="Guard_(computer_science)" title="Guard (computer science)">guarded expressions</a> (or just a guard) between <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">}</span></code>, separated by <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="p">⋄</span></code> or new-lines, wherein <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code> denotes the left argument and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> the right, and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇</span></code> denotes <a href="Recursion_(computer_science)" title="Recursion (computer science)">recursion</a> (function self-reference). For example, the function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">PT</span></code> tests whether each row of <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> is a <a href="Pythagorean_triplet" class="mw-redirect" title="Pythagorean triplet">Pythagorean triplet</a> (by testing whether the sum of squares equals twice the square of the maximum).
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">PT</span><span class="kd">←</span><span class="w"> </span><span class="kt">{</span><span class="p">(</span><span class="o">+</span><span class="na">/</span><span class="bp">⍵</span><span class="o">*</span><span class="m">2</span><span class="p">)</span><span class="o">=</span><span class="m">2</span><span class="o">×</span><span class="p">(</span><span class="o">⌈</span><span class="na">/</span><span class="bp">⍵</span><span class="p">)</span><span class="o">*</span><span class="m">2</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">PT</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">5</span>
<span class="m">1</span>
<span class="w"> </span><span class="nv">x</span>
<span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">3</span>
<span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="m">6</span>
<span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">12</span>
<span class="m">17</span><span class="w"> </span><span class="m">16</span><span class="w"> </span><span class="m">8</span>
<span class="m">11</span><span class="w"> </span><span class="m">12</span><span class="w"> </span><span class="m">4</span>
<span class="m">17</span><span class="w"> </span><span class="m">15</span><span class="w"> </span><span class="m">8</span>
<span class="w"> </span><span class="nv">PT</span><span class="w"> </span><span class="nv">x</span>
<span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
</pre></div>
<p>
The <a href="Factorial" title="Factorial">factorial</a> function as a dfn:
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">fact</span><span class="kd">←</span><span class="w"> </span><span class="kt">{</span><span class="m">0</span><span class="o">=</span><span class="bp">⍵:</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">⍵</span><span class="o">×</span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="o">-</span><span class="m">1</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">fact</span><span class="w"> </span><span class="m">5</span>
<span class="m">120</span>
<span class="w"> </span><span class="nv">fact</span><span class="na">¨</span><span class="w"> </span><span class="o">⍳</span><span class="m">10</span><span class="w"> </span><span class="c1">⍝ fact applied to each element of 0 to 9</span>
<span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">6</span><span class="w"> </span><span class="m">24</span><span class="w"> </span><span class="m">120</span><span class="w"> </span><span class="m">720</span><span class="w"> </span><span class="m">5040</span><span class="w"> </span><span class="m">40320</span><span class="w"> </span><span class="m">362880</span>
</pre></div>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Description">Description</h2></div>
<p>The rules for dfns are summarized by the following "reference card":<sup id="cite_ref-refcard_2-0" class="reference"><a href="#cite_note-refcard-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<table class="wikitable">
<tbody><tr bgcolor="#ffffff">
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span><span class="bp">⍺</span><span class="w"> </span><span class="nv">function</span><span class="w"> </span><span class="bp">⍵</span><span class="kt">}</span></code>
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span><span class="bp">⍺⍺</span><span class="w"> </span><span class="nv">operator</span><span class="w"> </span><span class="bp">⍵⍵</span><span class="kt">}</span></code>
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">:</span></code> guard
</td></tr>
<tr bgcolor="#ffffff">
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code> left argument
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code> left operand
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">::</span></code> error-guard
</td></tr>
<tr bgcolor="#ffffff">
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> right argument
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵⍵</span></code> right operand
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span><span class="kd">←</span></code> default left argument
</td></tr>
<tr bgcolor="#ffffff">
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇</span></code> self-reference
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇∇</span></code> self-reference
</td>
<td><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">s</span><span class="kd">←</span></code> shy result
</td></tr></tbody></table>
<p>A dfn is a sequence of possibly <a href="Guard_(computer_science)" title="Guard (computer science)">guarded expressions</a> (or just a guard) between <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">}</span></code>, separated by <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="p">⋄</span></code> or new-lines.
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">expression</span>
<span class="nv">guard</span><span class="bp">:</span><span class="w"> </span><span class="nv">expression</span>
<span class="nv">guard</span><span class="bp">:</span>
</pre></div>
<p>The expressions and/or guards are evaluated in sequence. A guard must evaluate to a 0 or 1; its associated expression is evaluated if the value is 1. A dfn terminates after the first unguarded expression which does not end in <a href="Assignment_(computer_science)" title="Assignment (computer science)">assignment</a>, or after the first guarded expression whose guard evaluates to 1, or if there are no more expressions. The result of a dfn is that of the last evaluated expression. If that last evaluated expression ends in assignment, the result is "shy"—not automatically displayed in the session.
</p><p>Names assigned in a dfn are <a href="Local_variable" title="Local variable">local</a> by default, with <a href="Scope_(computer_science)#Lexical_scoping" title="Scope (computer science)">lexical scope</a>.
</p><p><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code> denotes the left function argument and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> the right; <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code> denotes the left operand and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵⍵</span></code> the right. If <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵⍵</span></code> occurs in the definition, then the dfn is a dyadic <a href="Higher-order_function" title="Higher-order function">operator</a>; if only <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code> occurs but not <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵⍵</span></code>, then it is a monadic operator; if neither <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code> or <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵⍵</span></code> occurs, then the dfn is a function.
</p><p>The special syntax <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span><span class="kd">←</span><span class="nv">expression</span></code> is used to give a default value to the left argument if a dfn is called monadically, that is, called with no left argument. The <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span><span class="kd">←</span><span class="nv">expression</span></code> is not evaluated otherwise.
</p><p><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇</span></code> denotes <a href="Recursion_(computer_science)" title="Recursion (computer science)">recursion</a> or self-reference by the function, and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇∇</span></code> denotes self-reference by the operator. Such denotation permits <a href="Anonymous_recursion" title="Anonymous recursion">anonymous recursion</a>.
</p><p><a href="Exception_handling" title="Exception handling">Error trapping</a> is provided through error-guards, <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">errnums</span><span class="bp">::</span><span class="nv">expression</span></code>. When an error is generated, the system searches dynamically through the calling functions for an error-guard that matches the error. If one is found, the execution environment is unwound to its state immediately prior to the error-guard's execution and the associated expression of the error-guard is evaluated as the result of the dfn.
</p><p>Additional descriptions, explanations, and tutorials on dfns are available in the cited articles.<sup id="cite_ref-Scholes2001a_3-0" class="reference"><a href="#cite_note-Scholes2001a-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2009b_4-0" class="reference"><a href="#cite_note-Scholes2009b-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2009c_5-0" class="reference"><a href="#cite_note-Scholes2009c-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2018v_6-0" class="reference"><a href="#cite_note-Scholes2018v-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2018t_7-0" class="reference"><a href="#cite_note-Scholes2018t-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<p>The examples here illustrate different aspects of dfns. Additional examples are found in the cited articles.<sup id="cite_ref-dfnsWS_8-0" class="reference"><a href="#cite_note-dfnsWS-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-APL1978_9-0" class="reference"><a href="#cite_note-APL1978-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-history50_10-0" class="reference"><a href="#cite_note-history50-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Default_left_argument">Default left argument</h3></div>
<p>The function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span><span class="bp">⍺</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span><span class="kt">}</span></code> adds <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code> to <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">0j1</span></code> (<span class="texhtml mvar" style="font-style:italic;">i</span> or <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\sqrt {-1}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<msqrt>
<mo>−<!-- − --></mo>
<mn>1</mn>
</msqrt>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\sqrt {-1}}}</annotation>
</semantics>
</math></span><img src="./4ea1ea9ac61e6e1e84ac39130f78143c18865719.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.906ex; height:3.009ex;" alt="{\displaystyle {\sqrt {-1}}}" loading="lazy"></span>) times <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code>.
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="kt">{</span><span class="bp">⍺</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span><span class="kt">}</span><span class="w"> </span><span class="m">4</span>
<span class="m">3J4</span>
<span class="w"> </span><span class="na">∘.</span><span class="kt">{</span><span class="bp">⍺</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span><span class="kt">}</span><span class="na">⍨</span><span class="w"> </span><span class="m">¯2</span><span class="o">+⍳</span><span class="m">5</span>
<span class="m">¯2J¯2</span><span class="w"> </span><span class="m">¯2J¯1</span><span class="w"> </span><span class="m">¯2</span><span class="w"> </span><span class="m">¯2J1</span><span class="w"> </span><span class="m">¯2J2</span>
<span class="m">¯1J¯2</span><span class="w"> </span><span class="m">¯1J¯1</span><span class="w"> </span><span class="m">¯1</span><span class="w"> </span><span class="m">¯1J1</span><span class="w"> </span><span class="m">¯1J2</span>
<span class="w"> </span><span class="m">0J¯2</span><span class="w"> </span><span class="m">0J¯1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0J1</span><span class="w"> </span><span class="m">0J2</span>
<span class="w"> </span><span class="m">1J¯2</span><span class="w"> </span><span class="m">1J¯1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1J1</span><span class="w"> </span><span class="m">1J2</span>
<span class="w"> </span><span class="m">2J¯2</span><span class="w"> </span><span class="m">2J¯1</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">2J1</span><span class="w"> </span><span class="m">2J2</span>
</pre></div>
<p>The significance of this function can be seen as follows:
</p>
<style data-mw-deduplicate="TemplateStyles:r1244412712">
/* start https://en.wikipedia.org/ */
.mw-parser-output .templatequote{overflow:hidden;margin:1em 0;padding:0 32px}.mw-parser-output .templatequotecite{line-height:1.5em;text-align:left;margin-top:0}@media(min-width:500px){.mw-parser-output .templatequotecite{padding-left:1.6em}}
/* end https://en.wikipedia.org/ */
</style><blockquote class="templatequote"><p>Complex numbers can be constructed as ordered pairs of real numbers, similar to how integers can be constructed as ordered pairs of natural numbers and rational numbers as ordered pairs of integers. For complex numbers, <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span><span class="bp">⍺</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span><span class="kt">}</span></code> plays the same role as <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">-</span></code> for integers and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">÷</span></code> for rational numbers.<sup id="cite_ref-Hui2016_11-0" class="reference"><a href="#cite_note-Hui2016-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §8">: §8 </span></sup></p></blockquote>
<p>Moreover, analogous to that monadic <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">-</span><span class="bp">⍵</span></code> ⇔ <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">0</span><span class="o">-</span><span class="bp">⍵</span></code> (<i>negate</i>) and monadic <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">÷</span><span class="bp">⍵</span></code> ⇔ <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">1</span><span class="o">÷</span><span class="bp">⍵</span></code> (<i>reciprocal</i>), a monadic definition of the function is useful, effected by specifying a default value of 0 for <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code>: if <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">j</span><span class="kd">←</span><span class="kt">{</span><span class="bp">⍺</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">⍺</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span><span class="kt">}</span></code>, then <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">j</span><span class="w"> </span><span class="bp">⍵</span></code> ⇔ <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">0</span><span class="w"> </span><span class="nv">j</span><span class="w"> </span><span class="bp">⍵</span></code> ⇔ <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">0</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span></code>.
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">j</span><span class="kd">←</span><span class="kt">{</span><span class="bp">⍺</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">⍺</span><span class="o">+</span><span class="m">0j1</span><span class="o">×</span><span class="bp">⍵</span><span class="kt">}</span>
<span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="nv">j</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">¯5.6</span><span class="w"> </span><span class="m">7.89</span>
<span class="m">3J4</span><span class="w"> </span><span class="m">3J¯5.6</span><span class="w"> </span><span class="m">3J7.89</span>
<span class="w"> </span><span class="nv">j</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">¯5.6</span><span class="w"> </span><span class="m">7.89</span>
<span class="m">0J4</span><span class="w"> </span><span class="m">0J¯5.6</span><span class="w"> </span><span class="m">0J7.89</span>
<span class="w"> </span><span class="nv">sin</span><span class="kd">←</span><span class="w"> </span><span class="m">1</span><span class="na">∘</span><span class="o">○</span>
<span class="w"> </span><span class="nv">cos</span><span class="kd">←</span><span class="w"> </span><span class="m">2</span><span class="na">∘</span><span class="o">○</span>
<span class="w"> </span><span class="nv">Euler</span><span class="kd">←</span><span class="w"> </span><span class="kt">{</span><span class="p">(</span><span class="o">*</span><span class="nv">j</span><span class="w"> </span><span class="bp">⍵</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nv">cos</span><span class="w"> </span><span class="bp">⍵</span><span class="p">)</span><span class="w"> </span><span class="nv">j</span><span class="w"> </span><span class="p">(</span><span class="nv">sin</span><span class="w"> </span><span class="bp">⍵</span><span class="p">)</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">Euler</span><span class="w"> </span><span class="p">(</span><span class="m">¯0.5</span><span class="o">+?</span><span class="m">10</span><span class="o">⍴</span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="nv">j</span><span class="w"> </span><span class="p">(</span><span class="m">¯0.5</span><span class="o">+?</span><span class="m">10</span><span class="o">⍴</span><span class="m">0</span><span class="p">)</span>
<span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span>
</pre></div>
<p>The last expression illustrates <a href="Euler's_formula" title="Euler's formula">Euler's formula</a> on ten random numbers with real and imaginary parts in the interval <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left(-0.5,0.5\right)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>(</mo>
<mrow>
<mo>−<!-- − --></mo>
<mn>0.5</mn>
<mo>,</mo>
<mn>0.5</mn>
</mrow>
<mo>)</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left(-0.5,0.5\right)}</annotation>
</semantics>
</math></span><img src="./603e6507dd57b57ed41e527036b55b69e208c671.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.595ex; height:2.843ex;" alt="{\displaystyle \left(-0.5,0.5\right)}" loading="lazy"></span>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Single_recursion">Single recursion</h3></div>
<p>The ternary construction of the <a href="Cantor_set" title="Cantor set">Cantor set</a> starts with the interval [0,1] and at each stage removes the middle third from each remaining subinterval:
</p><p><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\biggl [}0,1{\biggr ]}\to }">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-OPEN">
<mo maxsize="2.047em" minsize="2.047em">[</mo>
</mrow>
</mrow>
<mn>0</mn>
<mo>,</mo>
<mn>1</mn>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-CLOSE">
<mo maxsize="2.047em" minsize="2.047em">]</mo>
</mrow>
</mrow>
<mo stretchy="false">→<!-- → --></mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\biggl [}0,1{\biggr ]}\to }</annotation>
</semantics>
</math></span><img src="./e7eb9d41d3abd96a641a6d0a42ef9f658e00206b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:8.783ex; height:6.176ex;" alt="{\displaystyle {\biggl [}0,1{\biggr ]}\to }" loading="lazy"></span>
</p><p><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left[0,{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},1\right]\to }">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>[</mo>
<mrow>
<mn>0</mn>
<mo>,</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mn>3</mn>
</mfrac>
</mrow>
</mrow>
<mo>]</mo>
</mrow>
<mo>∪<!-- ∪ --></mo>
<mrow>
<mo>[</mo>
<mrow>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>2</mn>
<mn>3</mn>
</mfrac>
</mrow>
<mo>,</mo>
<mn>1</mn>
</mrow>
<mo>]</mo>
</mrow>
<mo stretchy="false">→<!-- → --></mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left[0,{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},1\right]\to }</annotation>
</semantics>
</math></span><img src="./14eda089dec5f40b78407470761df675f29eb29b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:18.851ex; height:6.176ex;" alt="{\displaystyle \left[0,{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},1\right]\to }" loading="lazy"></span>
</p><p><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left[0,{\frac {1}{9}}\right]\cup \left[{\frac {2}{9}},{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},{\frac {7}{9}}\right]\cup \left[{\frac {8}{9}},1\right]\to \cdots }">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>[</mo>
<mrow>
<mn>0</mn>
<mo>,</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mn>9</mn>
</mfrac>
</mrow>
</mrow>
<mo>]</mo>
</mrow>
<mo>∪<!-- ∪ --></mo>
<mrow>
<mo>[</mo>
<mrow>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>2</mn>
<mn>9</mn>
</mfrac>
</mrow>
<mo>,</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mn>3</mn>
</mfrac>
</mrow>
</mrow>
<mo>]</mo>
</mrow>
<mo>∪<!-- ∪ --></mo>
<mrow>
<mo>[</mo>
<mrow>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>2</mn>
<mn>3</mn>
</mfrac>
</mrow>
<mo>,</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>7</mn>
<mn>9</mn>
</mfrac>
</mrow>
</mrow>
<mo>]</mo>
</mrow>
<mo>∪<!-- ∪ --></mo>
<mrow>
<mo>[</mo>
<mrow>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>8</mn>
<mn>9</mn>
</mfrac>
</mrow>
<mo>,</mo>
<mn>1</mn>
</mrow>
<mo>]</mo>
</mrow>
<mo stretchy="false">→<!-- → --></mo>
<mo>⋯<!-- ⋯ --></mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left[0,{\frac {1}{9}}\right]\cup \left[{\frac {2}{9}},{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},{\frac {7}{9}}\right]\cup \left[{\frac {8}{9}},1\right]\to \cdots }</annotation>
</semantics>
</math></span><img src="./ca7e65312fc194a15cc9d6af51d003f1bf01f054.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:42.357ex; height:6.176ex;" alt="{\displaystyle \left[0,{\frac {1}{9}}\right]\cup \left[{\frac {2}{9}},{\frac {1}{3}}\right]\cup \left[{\frac {2}{3}},{\frac {7}{9}}\right]\cup \left[{\frac {8}{9}},1\right]\to \cdots }" loading="lazy"></span>
</p><p>The Cantor set of order <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> defined as a dfn:<sup id="cite_ref-Hui2016_11-1" class="reference"><a href="#cite_note-Hui2016-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §2.5">: §2.5 </span></sup>
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">Cantor</span><span class="kd">←</span><span class="w"> </span><span class="kt">{</span><span class="m">0</span><span class="o">=</span><span class="bp">⍵:</span><span class="o">,</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="o">,</span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="na">∘.</span><span class="o">∧</span><span class="w"> </span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="o">-</span><span class="m">1</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">Cantor</span><span class="w"> </span><span class="m">0</span>
<span class="m">1</span>
<span class="w"> </span><span class="nv">Cantor</span><span class="w"> </span><span class="m">1</span>
<span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="w"> </span><span class="nv">Cantor</span><span class="w"> </span><span class="m">2</span>
<span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="w"> </span><span class="nv">Cantor</span><span class="w"> </span><span class="m">3</span>
<span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
</pre></div>
<p>Cantor 0 to Cantor 6 depicted as black bars:
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>
The function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">sieve</span><span class="w"> </span><span class="bp">⍵</span></code> computes a bit vector of length <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> so that bit <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">i</span></code> (for <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">0</span><span class="o">≤</span><span class="nv">i</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">i</span><span class="o"><</span><span class="bp">⍵</span></code>) is 1 if and only if <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">i</span></code> is a <a href="Prime_number" title="Prime number">prime</a>.<sup id="cite_ref-history50_10-1" class="reference"><a href="#cite_note-history50-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §46">: §46 </span></sup>
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">sieve</span><span class="kd">←</span><span class="kt">{</span>
<span class="w"> </span><span class="m">4</span><span class="o">≥</span><span class="bp">⍵:⍵</span><span class="o">⍴</span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span>
<span class="w"> </span><span class="nv">r</span><span class="kd">←</span><span class="o">⌊</span><span class="m">0.5</span><span class="o">*</span><span class="na">⍨</span><span class="nv">n</span><span class="kd">←</span><span class="bp">⍵</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">17</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">23</span><span class="w"> </span><span class="m">29</span><span class="w"> </span><span class="m">31</span><span class="w"> </span><span class="m">37</span><span class="w"> </span><span class="m">41</span><span class="w"> </span><span class="m">43</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="p">(</span><span class="m">1</span><span class="o">+</span><span class="p">(</span><span class="nv">n</span><span class="o">≤×</span><span class="na">⍀</span><span class="nv">p</span><span class="p">)</span><span class="o">⍳</span><span class="m">1</span><span class="p">)</span><span class="o">↑</span><span class="nv">p</span>
<span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="w"> </span><span class="m">0</span><span class="na">@</span><span class="m">1</span><span class="w"> </span><span class="o">⊃</span><span class="w"> </span><span class="kt">{</span><span class="p">(</span><span class="nv">m</span><span class="o">⍴</span><span class="bp">⍵</span><span class="p">)</span><span class="o">></span><span class="nv">m</span><span class="o">⍴</span><span class="bp">⍺</span><span class="o">↑</span><span class="m">1</span><span class="w"> </span><span class="o">⊣</span><span class="w"> </span><span class="nv">m</span><span class="kd">←</span><span class="nv">n</span><span class="o">⌊</span><span class="bp">⍺</span><span class="o">×≢</span><span class="bp">⍵</span><span class="kt">}</span><span class="na">⌿</span><span class="w"> </span><span class="o">⊖</span><span class="m">1</span><span class="o">,</span><span class="nv">p</span>
<span class="w"> </span><span class="kt">{</span><span class="nv">r</span><span class="o"><</span><span class="nv">q</span><span class="kd">←</span><span class="nv">b</span><span class="o">⍳</span><span class="m">1</span><span class="bp">:</span><span class="nv">b</span><span class="o">⊣</span><span class="nv">b</span><span class="sr">[</span><span class="bp">⍵</span><span class="sr">]</span><span class="kd">←</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="nv">q</span><span class="o">,</span><span class="nv">q</span><span class="o">×⍸</span><span class="nv">b</span><span class="o">↑</span><span class="na">⍨</span><span class="o">⌈</span><span class="nv">n</span><span class="o">÷</span><span class="nv">q</span><span class="sr">]</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="o">,</span><span class="nv">q</span><span class="kt">}</span><span class="nv">p</span>
<span class="kt">}</span>
<span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="o">⍴</span><span class="w"> </span><span class="nv">sieve</span><span class="w"> </span><span class="m">100</span>
<span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span>
<span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span>
<span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span>
<span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span>
<span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span>
<span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">0</span>
<span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="nv">sieve</span><span class="w"> </span><span class="m">1e9</span>
<span class="w"> </span><span class="o">≢</span><span class="nv">b</span>
<span class="m">1000000000</span>
<span class="w"> </span><span class="p">(</span><span class="m">10</span><span class="o">*⍳</span><span class="m">10</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="na">⌿</span><span class="o">↑</span><span class="p">)</span><span class="na">⍤</span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="o">⊢</span><span class="nv">b</span>
<span class="m">0</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">25</span><span class="w"> </span><span class="m">168</span><span class="w"> </span><span class="m">1229</span><span class="w"> </span><span class="m">9592</span><span class="w"> </span><span class="m">78498</span><span class="w"> </span><span class="m">664579</span><span class="w"> </span><span class="m">5761455</span><span class="w"> </span><span class="m">50847534</span>
</pre></div>
<p>The last sequence, the number of primes less than powers of 10, is an initial segment of <span class="nowrap external"><a href="On-Line_Encyclopedia_of_Integer_Sequences" title="On-Line Encyclopedia of Integer Sequences">OEIS</a>: <a href="https://oeis.org/A006880" class="extiw external" title="oeis:A006880">A006880</a></span>. The last number, 50847534, is the number of primes less than <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 10^{9}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msup>
<mn>10</mn>
<mrow class="MJX-TeXAtom-ORD">
<mn>9</mn>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 10^{9}}</annotation>
</semantics>
</math></span><img src="./c5f8dddd44eb018f09163e18ba8f19485e38bdb7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:3.379ex; height:2.676ex;" alt="{\displaystyle 10^{9}}" loading="lazy"></span>. It is called Bertelsen's number, memorably described by <a href="MathWorld" title="MathWorld">MathWorld</a> as "an erroneous name erroneously given the erroneous value of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \pi (10^{9})=50847478}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>π<!-- π --></mi>
<mo stretchy="false">(</mo>
<msup>
<mn>10</mn>
<mrow class="MJX-TeXAtom-ORD">
<mn>9</mn>
</mrow>
</msup>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>50847478</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \pi (10^{9})=50847478}</annotation>
</semantics>
</math></span><img src="./383fa70c48fe4b9fd912fe7bf6a81febb444e255.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:18.919ex; height:3.176ex;" alt="{\displaystyle \pi (10^{9})=50847478}" loading="lazy"></span>".<sup id="cite_ref-MathWorld_12-0" class="reference"><a href="#cite_note-MathWorld-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p><p><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">sieve</span></code> uses two different methods to mark composites with 0s, both effected using local anonymous dfns: The first uses the <a href="Sieve_of_Eratosthenes" title="Sieve of Eratosthenes">sieve of Eratosthenes</a> on an initial mask of 1 and a prefix of the primes 2 3...43, using the <i>insert</i> operator <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="na">⌿</span></code> (<a href="Fold_(higher-order_function)" title="Fold (higher-order function)">right fold</a>). (The length of the prefix obtains by comparison with the <a href="Primorial" title="Primorial">primorial function</a> <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">×</span><span class="na">⍀</span><span class="nv">p</span></code>.) The second finds the smallest new prime <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">q</span></code> remaining in <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">b</span></code> (<code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">q</span><span class="kd">←</span><span class="nv">b</span><span class="o">⍳</span><span class="m">1</span></code>), and sets to 0 bit <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">q</span></code> itself and bits at <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">q</span></code> times the numbers at remaining 1 bits in an initial segment of <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">b</span></code> (<code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">⍸</span><span class="nv">b</span><span class="o">↑</span><span class="na">⍨</span><span class="o">⌈</span><span class="nv">n</span><span class="o">÷</span><span class="nv">q</span></code>). This second dfn uses tail recursion.
</p>
<div class="mw-heading mw-heading3"><h3 id="Tail_recursion">Tail recursion</h3></div>
<p>Typically, the <a href="Factorial" title="Factorial">factorial</a> function is define recursively (as <a href="#factorial">above</a>), but it can be coded to exploit <a href="Tail_call" title="Tail call">tail recursion</a> by using an accumulator left argument:<sup id="cite_ref-fact_13-0" class="reference"><a href="#cite_note-fact-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">fac</span><span class="kd">←</span><span class="kt">{</span><span class="bp">⍺</span><span class="kd">←</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">⍵</span><span class="o">=</span><span class="m">0</span><span class="bp">:⍺</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="p">(</span><span class="bp">⍺</span><span class="o">×</span><span class="bp">⍵</span><span class="p">)</span><span class="w"> </span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="o">-</span><span class="m">1</span><span class="kt">}</span>
</pre></div>
<p>Similarly, the <a href="Determinant" title="Determinant">determinant</a> of a square complex matrix using <a href="Gaussian_elimination" title="Gaussian elimination">Gaussian elimination</a> can be computed with tail recursion:<sup id="cite_ref-det_14-0" class="reference"><a href="#cite_note-det-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">det</span><span class="kd">←</span><span class="kt">{</span><span class="w"> </span><span class="c1">⍝ determinant of a square complex matrix</span>
<span class="w"> </span><span class="bp">⍺</span><span class="kd">←</span><span class="m">1</span><span class="w"> </span><span class="c1">⍝ product of co-factor coefficients so far</span>
<span class="w"> </span><span class="m">0</span><span class="o">=≢</span><span class="bp">⍵:⍺</span><span class="w"> </span><span class="c1">⍝ result for 0-by-0</span>
<span class="w"> </span><span class="p">(</span><span class="nv">i</span><span class="w"> </span><span class="nv">j</span><span class="p">)</span><span class="kd">←</span><span class="p">(</span><span class="o">⍴</span><span class="bp">⍵</span><span class="p">)</span><span class="o">⊤⊃⍒|,</span><span class="bp">⍵</span><span class="w"> </span><span class="c1">⍝ row and column index of the maximal element</span>
<span class="w"> </span><span class="nv">k</span><span class="kd">←</span><span class="o">⍳≢</span><span class="bp">⍵</span>
<span class="w"> </span><span class="p">(</span><span class="bp">⍺</span><span class="o">×</span><span class="bp">⍵</span><span class="sr">[</span><span class="nv">i</span><span class="sr">;</span><span class="nv">j</span><span class="sr">]</span><span class="o">×</span><span class="m">¯1</span><span class="o">*</span><span class="nv">i</span><span class="o">+</span><span class="nv">j</span><span class="p">)</span><span class="w"> </span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="sr">[</span><span class="nv">k</span><span class="o">~</span><span class="nv">i</span><span class="sr">;</span><span class="nv">k</span><span class="o">~</span><span class="nv">j</span><span class="sr">]</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="bp">⍵</span><span class="sr">[</span><span class="nv">k</span><span class="o">~</span><span class="nv">i</span><span class="sr">;</span><span class="nv">j</span><span class="sr">]</span><span class="w"> </span><span class="na">∘.</span><span class="o">×</span><span class="w"> </span><span class="bp">⍵</span><span class="sr">[</span><span class="nv">i</span><span class="sr">;</span><span class="nv">k</span><span class="o">~</span><span class="nv">j</span><span class="sr">]</span><span class="o">÷</span><span class="bp">⍵</span><span class="sr">[</span><span class="nv">i</span><span class="sr">;</span><span class="nv">j</span><span class="sr">]</span>
<span class="kt">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Multiple_recursion">Multiple recursion</h3></div>
<p>A <a href="Integer_partition" title="Integer partition">partition</a> of a non-negative integer <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n}</annotation>
</semantics>
</math></span><img src="./a601995d55609f2d9f5e233e36fbe9ea26011b3b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.395ex; height:1.676ex;" alt="{\displaystyle n}" loading="lazy"></span> is a vector <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>v</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v}</annotation>
</semantics>
</math></span><img src="./e07b00e7fc0847fbd16391c778d65bc25c452597.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.128ex; height:1.676ex;" alt="{\displaystyle v}" loading="lazy"></span> of positive integers such that <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">+</span><span class="na">⌿</span><span class="nv">v</span></code>, where the order in <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>v</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v}</annotation>
</semantics>
</math></span><img src="./e07b00e7fc0847fbd16391c778d65bc25c452597.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.128ex; height:1.676ex;" alt="{\displaystyle v}" loading="lazy"></span> is not significant. For example, <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">2</span><span class="w"> </span><span class="m">2</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">2</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span></code> are partitions of 4, and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">2</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">1</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">1</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">2</span></code> are considered to be the same partition.
</p><p>The <a href="Partition_function_(number_theory)" title="Partition function (number theory)">partition function</a> <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle P(n)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>P</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle P(n)}</annotation>
</semantics>
</math></span><img src="./5e303d2c14cd399b6f52b468c9fd44a542bed422.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.949ex; height:2.843ex;" alt="{\displaystyle P(n)}" loading="lazy"></span> counts the number of partitions. The function is of interest in <a href="Number_theory" title="Number theory">number theory</a>, studied by <a href="Leonhard_Euler" title="Leonhard Euler">Euler</a>, <a href="G._H._Hardy" title="G. H. Hardy">Hardy</a>, <a href="Srinivasa_Ramanujan" title="Srinivasa Ramanujan">Ramanujan</a>, <a href="Paul_Erd%C5%91s" title="Paul Erdős">Erdős</a>, and others. The recurrence relation
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle P(n)=\sum _{k=1}^{n}(-1)^{k+1}[P(n-{\frac {1}{2}}k(3k-1))+P(n-{\frac {1}{2}}k(3k+1))]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>P</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</munderover>
<mo stretchy="false">(</mo>
<mo>−<!-- − --></mo>
<mn>1</mn>
<msup>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msup>
<mo stretchy="false">[</mo>
<mi>P</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mn>2</mn>
</mfrac>
</mrow>
<mi>k</mi>
<mo stretchy="false">(</mo>
<mn>3</mn>
<mi>k</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mi>P</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mn>2</mn>
</mfrac>
</mrow>
<mi>k</mi>
<mo stretchy="false">(</mo>
<mn>3</mn>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
<mo stretchy="false">]</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle P(n)=\sum _{k=1}^{n}(-1)^{k+1}[P(n-{\frac {1}{2}}k(3k-1))+P(n-{\frac {1}{2}}k(3k+1))]}</annotation>
</semantics>
</math></span><img src="./2468d1bad94400d148e6de56414247554499a1fd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:61.877ex; height:6.843ex;" alt="{\displaystyle P(n)=\sum _{k=1}^{n}(-1)^{k+1}[P(n-{\frac {1}{2}}k(3k-1))+P(n-{\frac {1}{2}}k(3k+1))]}" loading="lazy"></span></dd></dl>
<p>derived from Euler's <a href="Pentagonal_number_theorem" title="Pentagonal number theorem">pentagonal number theorem</a>.<sup id="cite_ref-MathWorldP_15-0" class="reference"><a href="#cite_note-MathWorldP-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> Written as a dfn:<sup id="cite_ref-history50_10-2" class="reference"><a href="#cite_note-history50-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §16">: §16 </span></sup>
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">pn</span><span class="w"> </span><span class="kd">←</span><span class="w"> </span><span class="kt">{</span><span class="m">1</span><span class="o">≥</span><span class="bp">⍵:</span><span class="m">0</span><span class="o">≤</span><span class="bp">⍵</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="o">-</span><span class="na">⌿</span><span class="o">+</span><span class="na">⌿</span><span class="bp">∇</span><span class="na">¨</span><span class="nv">rec</span><span class="w"> </span><span class="bp">⍵</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">rec</span><span class="w"> </span><span class="kd">←</span><span class="w"> </span><span class="kt">{</span><span class="bp">⍵</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="o">÷</span><span class="na">∘</span><span class="m">2</span><span class="w"> </span><span class="p">(</span><span class="o">×</span><span class="na">⍤</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="m">¯1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="na">∘.</span><span class="o">+</span><span class="w"> </span><span class="m">3</span><span class="na">∘</span><span class="o">×</span><span class="p">)</span><span class="w"> </span><span class="m">1</span><span class="o">+⍳⌈</span><span class="m">0.5</span><span class="o">*</span><span class="na">⍨</span><span class="bp">⍵</span><span class="o">×</span><span class="m">2</span><span class="o">÷</span><span class="m">3</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">pn</span><span class="w"> </span><span class="m">10</span>
<span class="m">42</span>
<span class="w"> </span><span class="nv">pn</span><span class="na">¨</span><span class="w"> </span><span class="o">⍳</span><span class="m">13</span><span class="w"> </span><span class="c1">⍝ OEIS A000041</span>
<span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="m">15</span><span class="w"> </span><span class="m">22</span><span class="w"> </span><span class="m">30</span><span class="w"> </span><span class="m">42</span><span class="w"> </span><span class="m">56</span><span class="w"> </span><span class="m">77</span>
</pre></div>
<p>The basis step <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">1</span><span class="o">≥</span><span class="bp">⍵:</span><span class="m">0</span><span class="o">≤</span><span class="bp">⍵</span></code> states that for <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">1</span><span class="o">≥</span><span class="bp">⍵</span></code>, the result of the function is <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="m">0</span><span class="o">≤</span><span class="bp">⍵</span></code>, 1 if ⍵ is 0 or 1 and 0 otherwise. The recursive step is highly multiply recursive. For example, <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">pn</span><span class="w"> </span><span class="m">200</span></code> would result in the function being applied to each element of <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">rec</span><span class="w"> </span><span class="m">200</span></code>, which are:
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">rec</span><span class="w"> </span><span class="m">200</span>
<span class="m">199</span><span class="w"> </span><span class="m">195</span><span class="w"> </span><span class="m">188</span><span class="w"> </span><span class="m">178</span><span class="w"> </span><span class="m">165</span><span class="w"> </span><span class="m">149</span><span class="w"> </span><span class="m">130</span><span class="w"> </span><span class="m">108</span><span class="w"> </span><span class="m">83</span><span class="w"> </span><span class="m">55</span><span class="w"> </span><span class="m">24</span><span class="w"> </span><span class="m">¯10</span>
<span class="m">198</span><span class="w"> </span><span class="m">193</span><span class="w"> </span><span class="m">185</span><span class="w"> </span><span class="m">174</span><span class="w"> </span><span class="m">160</span><span class="w"> </span><span class="m">143</span><span class="w"> </span><span class="m">123</span><span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="m">74</span><span class="w"> </span><span class="m">45</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">¯22</span>
</pre></div>
<p>and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">pn</span><span class="w"> </span><span class="m">200</span></code> requires longer than the <a href="Age_of_the_universe" title="Age of the universe">age of the universe</a> to compute (<span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 7.57\times 10^{47}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>7.57</mn>
<mo>×<!-- × --></mo>
<msup>
<mn>10</mn>
<mrow class="MJX-TeXAtom-ORD">
<mn>47</mn>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 7.57\times 10^{47}}</annotation>
</semantics>
</math></span><img src="./c229aa95f0e45783f163a6209320fedd6f6f27af.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:11.176ex; height:2.676ex;" alt="{\displaystyle 7.57\times 10^{47}}" loading="lazy"></span> function calls to itself).<sup id="cite_ref-history50_10-3" class="reference"><a href="#cite_note-history50-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §16">: §16 </span></sup> The compute time can be reduced by <a href="Memoization" title="Memoization">memoization</a>, here implemented as the direct operator (higher-order function) <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">M</span></code>:
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">M</span><span class="kd">←</span><span class="kt">{</span>
<span class="w"> </span><span class="nv">f</span><span class="kd">←</span><span class="bp">⍺⍺</span>
<span class="w"> </span><span class="nv">i</span><span class="kd">←</span><span class="m">2</span><span class="o">+</span><span class="s1">'⋄'</span><span class="o">⍳</span><span class="na">⍨</span><span class="nv">t</span><span class="kd">←</span><span class="m">2</span><span class="o">↓,</span><span class="nf">⎕cr</span><span class="w"> </span><span class="s1">'f'</span>
<span class="w"> </span><span class="o">⍎</span><span class="s1">'{T←(1+⍵)⍴¯1 ⋄ '</span><span class="o">,</span><span class="p">(</span><span class="nv">i</span><span class="o">↑</span><span class="nv">t</span><span class="p">)</span><span class="o">,</span><span class="s1">'¯1≢T[⍵]:⊃T[⍵] ⋄ ⊃T[⍵]←⊂'</span><span class="o">,</span><span class="p">(</span><span class="nv">i</span><span class="o">↓</span><span class="nv">t</span><span class="p">)</span><span class="o">,</span><span class="s1">'⍵}⍵'</span>
<span class="kt">}</span>
<span class="w"> </span><span class="nv">pn</span><span class="w"> </span><span class="nv">M</span><span class="w"> </span><span class="m">200</span>
<span class="m">3.973E12</span>
<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">⍕</span><span class="w"> </span><span class="nv">pn</span><span class="w"> </span><span class="nv">M</span><span class="w"> </span><span class="m">200</span><span class="w"> </span><span class="c1">⍝ format to 0 decimal places</span>
<span class="w"> </span><span class="m">3972999029388</span>
</pre></div>
<p>This value of <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">pn</span><span class="w"> </span><span class="nv">M</span><span class="w"> </span><span class="m">200</span></code> agrees with that computed by Hardy and Ramanujan in 1918.<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>
</p><p>The memo operator <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">M</span></code> defines a variant of its operand function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code> to use a <a href="Cache_(computing)" title="Cache (computing)">cache</a> <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">T</span></code> and then evaluates it. With the operand <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">pn</span></code> the variant is:
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="kt">{</span><span class="nv">T</span><span class="kd">←</span><span class="p">(</span><span class="m">1</span><span class="o">+</span><span class="bp">⍵</span><span class="p">)</span><span class="o">⍴</span><span class="m">¯1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="kt">{</span><span class="m">1</span><span class="o">≥</span><span class="bp">⍵:</span><span class="m">0</span><span class="o">≤</span><span class="bp">⍵</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="m">¯1</span><span class="o">≢</span><span class="nv">T</span><span class="sr">[</span><span class="bp">⍵</span><span class="sr">]</span><span class="bp">:</span><span class="o">⊃</span><span class="nv">T</span><span class="sr">[</span><span class="bp">⍵</span><span class="sr">]</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="o">⊃</span><span class="nv">T</span><span class="sr">[</span><span class="bp">⍵</span><span class="sr">]</span><span class="kd">←</span><span class="o">⊂-</span><span class="na">⌿</span><span class="o">+</span><span class="na">⌿</span><span class="bp">∇</span><span class="na">¨</span><span class="nv">rec</span><span class="w"> </span><span class="bp">⍵</span><span class="kt">}</span><span class="bp">⍵</span><span class="kt">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Direct_operator_(dop)">Direct operator (dop)</h3></div>
<p><a href="Quicksort" title="Quicksort">Quicksort</a> on an array <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> works by choosing a "pivot" at random among its major cells, then catenating the sorted major cells which strictly precede the pivot, the major cells equal to the pivot, and the sorted major cells which strictly follow the pivot, as determined by a comparison function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code>. Defined as a direct <a href="Higher-order_function" title="Higher-order function">operator</a> (dop) <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">Q</span></code>:
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">Q</span><span class="kd">←</span><span class="kt">{</span><span class="m">1</span><span class="o">≥≢</span><span class="bp">⍵:⍵</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="p">(</span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="na">⌿⍨</span><span class="m">0</span><span class="o">></span><span class="nv">s</span><span class="p">)</span><span class="o">⍪</span><span class="p">(</span><span class="bp">⍵</span><span class="na">⌿⍨</span><span class="m">0</span><span class="o">=</span><span class="nv">s</span><span class="p">)</span><span class="o">⍪</span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="na">⌿⍨</span><span class="m">0</span><span class="o"><</span><span class="nv">s</span><span class="kd">←</span><span class="bp">⍵</span><span class="w"> </span><span class="bp">⍺⍺</span><span class="w"> </span><span class="bp">⍵</span><span class="o">⌷</span><span class="na">⍨</span><span class="o">?≢</span><span class="bp">⍵</span><span class="kt">}</span>
<span class="w"> </span><span class="c1">⍝ precedes ⍝ follows ⍝ equals</span>
<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="p">(</span><span class="o">×-</span><span class="p">)</span><span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="p">(</span><span class="o">×-</span><span class="p">)</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="p">(</span><span class="o">×-</span><span class="p">)</span><span class="w"> </span><span class="m">8</span>
<span class="m">¯1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">0</span>
<span class="w"> </span><span class="nv">x</span><span class="kd">←</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">6</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="m">15</span><span class="w"> </span><span class="m">14</span>
<span class="w"> </span><span class="p">(</span><span class="o">×-</span><span class="p">)</span><span class="w"> </span><span class="nv">Q</span><span class="w"> </span><span class="nv">x</span>
<span class="m">0</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">6</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="m">14</span><span class="w"> </span><span class="m">15</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">19</span>
</pre></div>
<p><code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">Q3</span></code> is a variant that catenates the three parts enclosed by the function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="o">⊂</span></code> instead of the parts <i>per se</i>. The three parts generated at each recursive step are apparent in the structure of the final result. Applying the function derived from <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">Q3</span></code> to the same argument multiple times gives different results because the pivots are chosen at random. <a href="Tree_traversal#In-order,_LNR" title="Tree traversal">In-order traversal</a> of the results does yield the same sorted array.
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">Q3</span><span class="kd">←</span><span class="kt">{</span><span class="m">1</span><span class="o">≥≢</span><span class="bp">⍵:⍵</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="p">(</span><span class="o">⊂</span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="na">⌿⍨</span><span class="m">0</span><span class="o">></span><span class="nv">s</span><span class="p">)</span><span class="o">⍪</span><span class="p">(</span><span class="o">⊂</span><span class="bp">⍵</span><span class="na">⌿⍨</span><span class="m">0</span><span class="o">=</span><span class="nv">s</span><span class="p">)</span><span class="o">⍪⊂</span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="na">⌿⍨</span><span class="m">0</span><span class="o"><</span><span class="nv">s</span><span class="kd">←</span><span class="bp">⍵</span><span class="w"> </span><span class="bp">⍺⍺</span><span class="w"> </span><span class="bp">⍵</span><span class="o">⌷</span><span class="na">⍨</span><span class="o">?≢</span><span class="bp">⍵</span><span class="kt">}</span>
<span class="w"> </span><span class="p">(</span><span class="o">×-</span><span class="p">)</span><span class="w"> </span><span class="nv">Q3</span><span class="w"> </span><span class="nv">x</span>
<span class="err">┌────────────────────────────────────────────┬─────┬┐</span>
<span class="err">│┌──────────────┬─┬─────────────────────────┐│</span><span class="m">19</span><span class="w"> </span><span class="m">19</span><span class="err">││</span>
<span class="err">││┌──────┬───┬─┐│</span><span class="m">6</span><span class="err">│┌──────┬─┬──────────────┐││</span><span class="w"> </span><span class="err">││</span>
<span class="err">│││┌┬─┬─┐│</span><span class="m">3</span><span class="w"> </span><span class="m">3</span><span class="err">│</span><span class="m">4</span><span class="err">││</span><span class="w"> </span><span class="err">││┌┬─┬─┐│</span><span class="m">9</span><span class="err">│┌┬──┬────────┐│││</span><span class="w"> </span><span class="err">││</span>
<span class="err">│││││</span><span class="m">0</span><span class="err">│</span><span class="m">2</span><span class="err">││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">││</span><span class="w"> </span><span class="err">││││</span><span class="m">7</span><span class="err">│</span><span class="m">8</span><span class="err">││</span><span class="w"> </span><span class="err">│││</span><span class="m">10</span><span class="err">│┌──┬──┬┐││││</span><span class="w"> </span><span class="err">││</span>
<span class="err">│││└┴─┴─┘│</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">││</span><span class="w"> </span><span class="err">││└┴─┴─┘│</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">││</span><span class="m">14</span><span class="err">│</span><span class="m">15</span><span class="err">││││││</span><span class="w"> </span><span class="err">││</span>
<span class="err">││└──────┴───┴─┘│</span><span class="w"> </span><span class="err">││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│└──┴──┴┘││││</span><span class="w"> </span><span class="err">││</span>
<span class="err">││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│└┴──┴────────┘│││</span><span class="w"> </span><span class="err">││</span>
<span class="err">││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│└──────┴─┴──────────────┘││</span><span class="w"> </span><span class="err">││</span>
<span class="err">│└──────────────┴─┴─────────────────────────┘│</span><span class="w"> </span><span class="err">││</span>
<span class="err">└────────────────────────────────────────────┴─────┴┘</span>
<span class="w"> </span><span class="p">(</span><span class="o">×-</span><span class="p">)</span><span class="w"> </span><span class="nv">Q3</span><span class="w"> </span><span class="nv">x</span>
<span class="err">┌───────────────────────────┬─┬─────────────────────────────┐</span>
<span class="err">│┌┬─┬──────────────────────┐│</span><span class="m">7</span><span class="err">│┌────────────────────┬─────┬┐│</span>
<span class="err">│││</span><span class="m">0</span><span class="err">│┌┬─┬─────────────────┐││</span><span class="w"> </span><span class="err">││┌──────┬──┬────────┐│</span><span class="m">19</span><span class="w"> </span><span class="m">19</span><span class="err">│││</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="m">2</span><span class="err">│┌────────────┬─┬┐│││</span><span class="w"> </span><span class="err">│││┌┬─┬─┐│</span><span class="m">10</span><span class="err">│┌──┬──┬┐││</span><span class="w"> </span><span class="err">│││</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">││┌───────┬─┬┐│</span><span class="m">6</span><span class="err">│││││</span><span class="w"> </span><span class="err">│││││</span><span class="m">8</span><span class="err">│</span><span class="m">9</span><span class="err">││</span><span class="w"> </span><span class="err">││</span><span class="m">14</span><span class="err">│</span><span class="m">15</span><span class="err">││││</span><span class="w"> </span><span class="err">│││</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│││┌┬───┬┐│</span><span class="m">4</span><span class="err">│││</span><span class="w"> </span><span class="err">│││││</span><span class="w"> </span><span class="err">│││└┴─┴─┘│</span><span class="w"> </span><span class="err">│└──┴──┴┘││</span><span class="w"> </span><span class="err">│││</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│││││</span><span class="m">3</span><span class="w"> </span><span class="m">3</span><span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│││││</span><span class="w"> </span><span class="err">││└──────┴──┴────────┘│</span><span class="w"> </span><span class="err">│││</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│││└┴───┴┘│</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│││││</span><span class="w"> </span><span class="err">│└────────────────────┴─────┴┘│</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">││└───────┴─┴┘│</span><span class="w"> </span><span class="err">│││││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│││</span><span class="w"> </span><span class="err">│└────────────┴─┴┘│││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="err">│││</span><span class="w"> </span><span class="err">│└┴─┴─────────────────┘││</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="err">│└┴─┴──────────────────────┘│</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="err">└───────────────────────────┴─┴─────────────────────────────┘</span>
</pre></div>
<p>The above formulation is not new; see for example Figure 3.7 of the classic <i>The Design and Analysis of Computer Algorithms</i>.<sup id="cite_ref-AHU_17-0" class="reference"><a href="#cite_note-AHU-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup> However, unlike the <a href="Pidgin_code" title="Pidgin code">pidgin</a> <a href="ALGOL" title="ALGOL">ALGOL</a> program in Figure 3.7, <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">Q</span></code> is executable, and the partial order used in the sorting is an operand, the <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="p">(</span><span class="o">×-</span><span class="p">)</span></code> the examples above.<sup id="cite_ref-APL1978_9-1" class="reference"><a href="#cite_note-APL1978-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Dfns_with_operators_and_trains">Dfns with operators and trains</h3></div>
<p>Dfns, especially anonymous dfns, work well with operators and trains. The following snippet solves a "Programming Pearls" puzzle:<sup id="cite_ref-Bentley1983_18-0" class="reference"><a href="#cite_note-Bentley1983-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup> given a dictionary of English words, here represented as the character matrix <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">a</span></code>, find all sets of anagrams.
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="kt">{</span><span class="bp">⍵</span><span class="sr">[</span><span class="o">⍋</span><span class="bp">⍵</span><span class="sr">]</span><span class="kt">}</span><span class="na">⍤</span><span class="m">1</span><span class="w"> </span><span class="o">⊢</span><span class="nv">a</span><span class="w"> </span><span class="p">(</span><span class="kt">{</span><span class="bp">⍵</span><span class="sr">[</span><span class="o">⍋</span><span class="bp">⍵</span><span class="sr">]</span><span class="kt">}</span><span class="na">⍤</span><span class="m">1</span><span class="w"> </span><span class="kt">{</span><span class="o">⊂</span><span class="bp">⍵</span><span class="kt">}</span><span class="na">⌸</span><span class="w"> </span><span class="o">⊢</span><span class="p">)</span><span class="w"> </span><span class="nv">a</span>
<span class="nv">pats</span><span class="w"> </span><span class="nv">apst</span><span class="w"> </span><span class="err">┌────┬────┬────┐</span>
<span class="nv">spat</span><span class="w"> </span><span class="nv">apst</span><span class="w"> </span><span class="err">│</span><span class="nv">pats</span><span class="err">│</span><span class="nv">teas</span><span class="err">│</span><span class="nv">star</span><span class="err">│</span>
<span class="nv">teas</span><span class="w"> </span><span class="nv">aest</span><span class="w"> </span><span class="err">│</span><span class="nv">spat</span><span class="err">│</span><span class="nv">sate</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">sate</span><span class="w"> </span><span class="nv">aest</span><span class="w"> </span><span class="err">│</span><span class="nv">taps</span><span class="err">│</span><span class="nv">etas</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">taps</span><span class="w"> </span><span class="nv">apst</span><span class="w"> </span><span class="err">│</span><span class="nv">past</span><span class="err">│</span><span class="nv">seat</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">etas</span><span class="w"> </span><span class="nv">aest</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span><span class="nv">eats</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">past</span><span class="w"> </span><span class="nv">apst</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span><span class="nv">tase</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">seat</span><span class="w"> </span><span class="nv">aest</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span><span class="nv">east</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">eats</span><span class="w"> </span><span class="nv">aest</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="err">│</span><span class="nv">seta</span><span class="err">│</span><span class="w"> </span><span class="err">│</span>
<span class="nv">tase</span><span class="w"> </span><span class="nv">aest</span><span class="w"> </span><span class="err">└────┴────┴────┘</span>
<span class="nv">star</span><span class="w"> </span><span class="nv">arst</span>
<span class="nv">east</span><span class="w"> </span><span class="nv">aest</span>
<span class="nv">seta</span><span class="w"> </span><span class="nv">aest</span>
</pre></div>
<p>The algorithm works by sorting the rows individually (<code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kt">{</span><span class="bp">⍵</span><span class="sr">[</span><span class="o">⍋</span><span class="bp">⍵</span><span class="sr">]</span><span class="kt">}</span><span class="na">⍤</span><span class="m">1</span><span class="w"> </span><span class="o">⊢</span><span class="nv">a</span></code>), and these sorted rows are used as keys ("signature" in the Programming Pearls description) to the <i>key</i> operator <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="na">⌸</span></code> to group the rows of the matrix.<sup id="cite_ref-APL1978_9-2" class="reference"><a href="#cite_note-APL1978-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §3.3">: §3.3 </span></sup> The expression on the right is a <i>train</i>, a syntactic form employed by APL to achieve <a href="Tacit_programming" title="Tacit programming">tacit programming</a>. Here, it is an isolated sequence of three functions such that <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="p">(</span><span class="nv">f</span><span class="w"> </span><span class="nv">g</span><span class="w"> </span><span class="nv">h</span><span class="p">)</span><span class="w"> </span><span class="bp">⍵</span></code> ⇔ <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="p">(</span><span class="nv">f</span><span class="w"> </span><span class="bp">⍵</span><span class="p">)</span><span class="w"> </span><span class="nv">g</span><span class="w"> </span><span class="p">(</span><span class="nv">h</span><span class="w"> </span><span class="bp">⍵</span><span class="p">)</span></code>, whence the expression on the right is equivalent to <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="p">(</span><span class="kt">{</span><span class="bp">⍵</span><span class="sr">[</span><span class="o">⍋</span><span class="bp">⍵</span><span class="sr">]</span><span class="kt">}</span><span class="na">⍤</span><span class="m">1</span><span class="w"> </span><span class="o">⊢</span><span class="nv">a</span><span class="p">)</span><span class="w"> </span><span class="kt">{</span><span class="o">⊂</span><span class="bp">⍵</span><span class="kt">}</span><span class="na">⌸</span><span class="w"> </span><span class="nv">a</span></code>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Lexical_scope">Lexical scope</h3></div>
<p>When an inner (nested) dfn refers to a name, it is sought by looking outward through enclosing dfns rather than down the <a href="Call_stack" title="Call stack">call stack</a>. This regime is said to employ <a href="Scope_(computer_science)#Lexical_scoping" title="Scope (computer science)">lexical scope</a> instead of APL's usual <a href="Scope_(computer_science)#Dynamic_scoping" title="Scope (computer science)">dynamic scope</a>. The distinction becomes apparent only if a call is made to a function defined at an outer level. For the more usual inward calls, the two regimes are indistinguishable.<sup id="cite_ref-Dyalog17.1_19-0" class="reference"><a href="#cite_note-Dyalog17.1-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: p.137">: p.137 </span></sup>
</p><p>For example, in the following function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">which</span></code>, the variable <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">ty</span></code> is defined both in <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">which</span></code> itself and in the inner function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">f1</span></code>. When <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">f1</span></code> calls outward to <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">f2</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">f2</span></code> refers to <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">ty</span></code>, it finds the outer one (with value <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="s1">'lexical'</span></code>) rather than the one defined in <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">f1</span></code> (with value <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="s1">'dynamic'</span></code>):
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">which</span><span class="kd">←</span><span class="kt">{</span>
<span class="w"> </span><span class="nv">ty</span><span class="kd">←</span><span class="s1">'lexical'</span>
<span class="w"> </span><span class="nv">f1</span><span class="kd">←</span><span class="kt">{</span><span class="nv">ty</span><span class="kd">←</span><span class="s1">'dynamic'</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">f2</span><span class="w"> </span><span class="bp">⍵</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">f2</span><span class="kd">←</span><span class="kt">{</span><span class="nv">ty</span><span class="o">,</span><span class="bp">⍵</span><span class="kt">}</span>
<span class="w"> </span><span class="nv">f1</span><span class="w"> </span><span class="bp">⍵</span>
<span class="kt">}</span>
<span class="w"> </span><span class="nv">which</span><span class="w"> </span><span class="s1">' scope'</span>
<span class="nv">lexical</span><span class="w"> </span><span class="nv">scope</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Error-guard">Error-guard</h3></div>
<p>The following function illustrates use of error guards:<sup id="cite_ref-Dyalog17.1_19-1" class="reference"><a href="#cite_note-Dyalog17.1-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: p.139">: p.139 </span></sup>
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">plus</span><span class="kd">←</span><span class="kt">{</span>
<span class="w"> </span><span class="nv">tx</span><span class="kd">←</span><span class="s1">'catch all'</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="m">0</span><span class="bp">::</span><span class="nv">tx</span>
<span class="w"> </span><span class="nv">tx</span><span class="kd">←</span><span class="s1">'domain'</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="m">11</span><span class="bp">::</span><span class="nv">tx</span>
<span class="w"> </span><span class="nv">tx</span><span class="kd">←</span><span class="s1">'length'</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="m">5</span><span class="bp">::</span><span class="nv">tx</span>
<span class="w"> </span><span class="bp">⍺</span><span class="o">+</span><span class="bp">⍵</span>
<span class="kt">}</span><span class="w"> </span>
<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="nv">plus</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="c1">⍝ no errors</span>
<span class="m">5</span>
<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="nv">plus</span><span class="w"> </span><span class="s1">'three'</span><span class="w"> </span><span class="c1">⍝ argument lengths don't match</span>
<span class="nv">length</span>
<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="nv">plus</span><span class="w"> </span><span class="s1">'four'</span><span class="w"> </span><span class="c1">⍝ can't add characters</span>
<span class="nv">domain</span>
<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="nv">plus</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">4</span><span class="o">⍴</span><span class="m">5</span><span class="w"> </span><span class="c1">⍝ can't add vector to matrix</span>
<span class="nv">catch</span><span class="w"> </span><span class="nv">all</span>
</pre></div>
<p>In APL, error number 5 is "length error"; error number 11 is "domain error"; and error number 0 is a "catch all" for error numbers 1 to 999.
</p><p>The example shows the unwinding of the local environment before an error-guard's expression is evaluated. The local name <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">tx</span></code> is set to describe the purview of its following error-guard. When an error occurs, the environment is unwound to expose <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">tx</span></code>'s statically correct value.
</p>
<div class="mw-heading mw-heading2"><h2 id="Dfns_versus_tradfns">Dfns <i>versus</i> tradfns</h2></div>
<p>Since direct functions are dfns, APL functions defined in the traditional manner are referred to as tradfns, pronounced "trad funs". Here, dfns and tradfns are compared by consideration of the function <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">sieve</span></code>: On the left is a dfn (as defined <a href="#sieve">above</a>); in the middle is a tradfn using <a href="Control_flow" title="Control flow">control structures</a>; on the right is a tradfn using <a href="Goto" title="Goto">gotos</a> (<code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kd">→</span></code>) and <a href="Label_(computer_science)" title="Label (computer science)">line labels</a>.
</p>
<table class="wikitable">
<tbody><tr style="vertical-align:top; background-color:#ffffff;">
<td><div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">sieve</span><span class="kd">←</span><span class="kt">{</span>
<span class="w"> </span><span class="m">4</span><span class="o">≥</span><span class="bp">⍵:⍵</span><span class="o">⍴</span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span>
<span class="w"> </span><span class="nv">r</span><span class="kd">←</span><span class="o">⌊</span><span class="m">0.5</span><span class="o">*</span><span class="na">⍨</span><span class="nv">n</span><span class="kd">←</span><span class="bp">⍵</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">17</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">23</span><span class="w"> </span><span class="m">29</span><span class="w"> </span><span class="m">31</span><span class="w"> </span><span class="m">37</span><span class="w"> </span><span class="m">41</span><span class="w"> </span><span class="m">43</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="p">(</span><span class="m">1</span><span class="o">+</span><span class="p">(</span><span class="nv">n</span><span class="o">≤×</span><span class="na">⍀</span><span class="nv">p</span><span class="p">)</span><span class="o">⍳</span><span class="m">1</span><span class="p">)</span><span class="o">↑</span><span class="nv">p</span>
<span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="w"> </span><span class="m">0</span><span class="na">@</span><span class="m">1</span><span class="w"> </span><span class="o">⊃</span><span class="w"> </span><span class="kt">{</span><span class="p">(</span><span class="nv">m</span><span class="o">⍴</span><span class="bp">⍵</span><span class="p">)</span><span class="o">></span><span class="nv">m</span><span class="o">⍴</span><span class="bp">⍺</span><span class="o">↑</span><span class="m">1</span><span class="w"> </span><span class="o">⊣</span><span class="w"> </span><span class="nv">m</span><span class="kd">←</span><span class="nv">n</span><span class="o">⌊</span><span class="bp">⍺</span><span class="o">×≢</span><span class="bp">⍵</span><span class="kt">}</span><span class="na">⌿</span><span class="w"> </span><span class="o">⊖</span><span class="m">1</span><span class="o">,</span><span class="nv">p</span>
<span class="w"> </span><span class="kt">{</span><span class="nv">r</span><span class="o"><</span><span class="nv">q</span><span class="kd">←</span><span class="nv">b</span><span class="o">⍳</span><span class="m">1</span><span class="bp">:</span><span class="nv">b</span><span class="o">⊣</span><span class="nv">b</span><span class="sr">[</span><span class="bp">⍵</span><span class="sr">]</span><span class="kd">←</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="nv">q</span><span class="o">,</span><span class="nv">q</span><span class="o">×⍸</span><span class="nv">b</span><span class="o">↑</span><span class="na">⍨</span><span class="o">⌈</span><span class="nv">n</span><span class="o">÷</span><span class="nv">q</span><span class="sr">]</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">∇</span><span class="w"> </span><span class="bp">⍵</span><span class="o">,</span><span class="nv">q</span><span class="kt">}</span><span class="nv">p</span>
<span class="kt">}</span>
</pre></div>
</td>
<td><div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="bp">∇</span><span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="nv">sieve1</span><span class="w"> </span><span class="nv">n</span><span class="sr">;</span><span class="nv">i</span><span class="sr">;</span><span class="nv">m</span><span class="sr">;</span><span class="nv">p</span><span class="sr">;</span><span class="nv">q</span><span class="sr">;</span><span class="nv">r</span>
<span class="w"> </span><span class="bp">:</span><span class="nv">If</span><span class="w"> </span><span class="m">4</span><span class="o">≥</span><span class="nv">n</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="nv">n</span><span class="o">⍴</span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">:</span><span class="nv">Return</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">:</span><span class="nv">EndIf</span>
<span class="w"> </span><span class="nv">r</span><span class="kd">←</span><span class="o">⌊</span><span class="m">0.5</span><span class="o">*</span><span class="na">⍨</span><span class="nv">n</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">17</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">23</span><span class="w"> </span><span class="m">29</span><span class="w"> </span><span class="m">31</span><span class="w"> </span><span class="m">37</span><span class="w"> </span><span class="m">41</span><span class="w"> </span><span class="m">43</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="p">(</span><span class="m">1</span><span class="o">+</span><span class="p">(</span><span class="nv">n</span><span class="o">≤×</span><span class="na">⍀</span><span class="nv">p</span><span class="p">)</span><span class="o">⍳</span><span class="m">1</span><span class="p">)</span><span class="o">↑</span><span class="nv">p</span>
<span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="m">1</span>
<span class="w"> </span><span class="bp">:</span><span class="nv">For</span><span class="w"> </span><span class="nv">q</span><span class="w"> </span><span class="bp">:</span><span class="nv">In</span><span class="w"> </span><span class="nv">p</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="p">(</span><span class="nv">m</span><span class="o">⍴</span><span class="nv">b</span><span class="p">)</span><span class="o">></span><span class="nv">m</span><span class="o">⍴</span><span class="nv">q</span><span class="o">↑</span><span class="m">1</span><span class="w"> </span><span class="o">⊣</span><span class="w"> </span><span class="nv">m</span><span class="kd">←</span><span class="nv">n</span><span class="o">⌊</span><span class="nv">q</span><span class="o">×≢</span><span class="nv">b</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">:</span><span class="nv">EndFor</span>
<span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="m">1</span><span class="sr">]</span><span class="kd">←</span><span class="m">0</span>
<span class="w"> </span><span class="bp">:</span><span class="nv">While</span><span class="w"> </span><span class="nv">r</span><span class="o">≥</span><span class="nv">q</span><span class="kd">←</span><span class="nv">b</span><span class="o">⍳</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="nv">q</span><span class="o">,</span><span class="nv">q</span><span class="o">×⍸</span><span class="nv">b</span><span class="o">↑</span><span class="na">⍨</span><span class="o">⌈</span><span class="nv">n</span><span class="o">÷</span><span class="nv">q</span><span class="sr">]</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">p</span><span class="o">⍪</span><span class="kd">←</span><span class="nv">q</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="bp">:</span><span class="nv">EndWhile</span>
<span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="nv">p</span><span class="sr">]</span><span class="kd">←</span><span class="m">1</span>
<span class="bp">∇</span>
</pre></div>
</td>
<td><div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="bp">∇</span><span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="nv">sieve2</span><span class="w"> </span><span class="nv">n</span><span class="sr">;</span><span class="nv">i</span><span class="sr">;</span><span class="nv">m</span><span class="sr">;</span><span class="nv">p</span><span class="sr">;</span><span class="nv">q</span><span class="sr">;</span><span class="nv">r</span>
<span class="w"> </span><span class="kd">→</span><span class="nv">L10</span><span class="w"> </span><span class="o">⍴</span><span class="na">⍨</span><span class="w"> </span><span class="m">4</span><span class="o"><</span><span class="nv">n</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="nv">n</span><span class="o">⍴</span><span class="m">0</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="kd">→</span><span class="m">0</span>
<span class="w"> </span><span class="nv">L10</span><span class="bp">:</span>
<span class="w"> </span><span class="nv">r</span><span class="kd">←</span><span class="o">⌊</span><span class="m">0.5</span><span class="o">*</span><span class="na">⍨</span><span class="nv">n</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="m">2</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="m">5</span><span class="w"> </span><span class="m">7</span><span class="w"> </span><span class="m">11</span><span class="w"> </span><span class="m">13</span><span class="w"> </span><span class="m">17</span><span class="w"> </span><span class="m">19</span><span class="w"> </span><span class="m">23</span><span class="w"> </span><span class="m">29</span><span class="w"> </span><span class="m">31</span><span class="w"> </span><span class="m">37</span><span class="w"> </span><span class="m">41</span><span class="w"> </span><span class="m">43</span>
<span class="w"> </span><span class="nv">p</span><span class="kd">←</span><span class="p">(</span><span class="m">1</span><span class="o">+</span><span class="p">(</span><span class="nv">n</span><span class="o">≤×</span><span class="na">\</span><span class="nv">p</span><span class="p">)</span><span class="o">⍳</span><span class="m">1</span><span class="p">)</span><span class="o">↑</span><span class="nv">p</span>
<span class="w"> </span><span class="nv">i</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="m">1</span>
<span class="w"> </span><span class="nv">L20</span><span class="bp">:</span>
<span class="w"> </span><span class="nv">b</span><span class="kd">←</span><span class="p">(</span><span class="nv">m</span><span class="o">⍴</span><span class="nv">b</span><span class="p">)</span><span class="o">></span><span class="nv">m</span><span class="o">⍴</span><span class="nv">p</span><span class="sr">[</span><span class="nv">i</span><span class="sr">]</span><span class="o">↑</span><span class="m">1</span><span class="w"> </span><span class="o">⊣</span><span class="w"> </span><span class="nv">m</span><span class="kd">←</span><span class="nv">n</span><span class="o">⌊</span><span class="nv">p</span><span class="sr">[</span><span class="nv">i</span><span class="sr">]</span><span class="o">×≢</span><span class="nv">b</span>
<span class="w"> </span><span class="kd">→</span><span class="nv">L20</span><span class="w"> </span><span class="o">⍴</span><span class="na">⍨</span><span class="w"> </span><span class="p">(</span><span class="o">≢</span><span class="nv">p</span><span class="p">)</span><span class="o">></span><span class="nv">i</span><span class="kd">←</span><span class="m">1</span><span class="o">+</span><span class="nv">i</span>
<span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="m">1</span><span class="sr">]</span><span class="kd">←</span><span class="m">0</span>
<span class="w"> </span><span class="nv">L30</span><span class="bp">:</span>
<span class="w"> </span><span class="kd">→</span><span class="nv">L40</span><span class="w"> </span><span class="o">⍴</span><span class="na">⍨</span><span class="w"> </span><span class="nv">r</span><span class="o"><</span><span class="nv">q</span><span class="kd">←</span><span class="nv">b</span><span class="o">⍳</span><span class="m">1</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="nv">q</span><span class="o">,</span><span class="nv">q</span><span class="o">×⍸</span><span class="nv">b</span><span class="o">↑</span><span class="na">⍨</span><span class="o">⌈</span><span class="nv">n</span><span class="o">÷</span><span class="nv">q</span><span class="sr">]</span><span class="kd">←</span><span class="m">0</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="nv">p</span><span class="o">⍪</span><span class="kd">←</span><span class="nv">q</span><span class="w"> </span><span class="p">⋄</span><span class="w"> </span><span class="kd">→</span><span class="nv">L30</span>
<span class="w"> </span><span class="nv">L40</span><span class="bp">:</span>
<span class="w"> </span><span class="nv">b</span><span class="sr">[</span><span class="nv">p</span><span class="sr">]</span><span class="kd">←</span><span class="m">1</span>
<span class="bp">∇</span>
</pre></div>
</td></tr></tbody></table>
<ul><li>A dfn can be <a href="Anonymous_function" title="Anonymous function">anonymous</a>; a tradfn must be named.</li>
<li>A dfn is named by assignment (<code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kd">←</span></code>); a tradfn is named by embedding the name in the representation of the function and applying <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nf">⎕fx</span></code> (a system function) to that representation.</li>
<li>A dfn is handier than a tradfn as an operand (see preceding items: a tradfn must be named; a tradfn is named by embedding ...).</li>
<li>Names <a href="Assignment_(computer_science)" title="Assignment (computer science)">assigned</a> in a dfn are <a href="Local_variable" title="Local variable">local</a> by default; names assigned in a tradfn are <a href="Global_variable" title="Global variable">global</a> unless specified in a locals list.</li>
<li>Locals in a dfn have <a href="Scope_(computer_science)#Lexical_scoping" title="Scope (computer science)">lexical scope</a>; locals in a tradfn have <a href="Scope_(computer_science)#Dynamic_scoping" title="Scope (computer science)">dynamic scope</a>, visible in called functions unless <a href="Variable_shadowing" title="Variable shadowing">shadowed</a> by <i>their</i> locals list.</li>
<li>The arguments of a dfn are named <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> and the operands of a dop are named <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺⍺</span></code> and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵⍵</span></code>; the arguments and operands of a tradfn can have any name, specified on its leading line.</li>
<li>The result (if any) of a dfn is unnamed; the result (if any) of a tradfn is named in its header.</li>
<li>A default value for ⍺ is specified more neatly than for the left argument of a tradfn.</li>
<li><a href="Recursion_(computer_science)" title="Recursion (computer science)">Recursion</a> in a dfn is effected by invoking <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇</span></code> or <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">∇∇</span></code> or its name; recursion in a tradfn is effected by invoking its name.</li>
<li><a href="Control_flow" title="Control flow">Flow control</a> in a dfn is effected by guards and function calls; that in a tradfn is by control structures and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kd">→</span></code> (goto) and line labels.</li>
<li>Evaluating an expression in a dfn not ending in assignment causes return from the dfn; evaluating a line in a tradfn not ending in assignment or goto displays the result of the line.</li>
<li>A dfn returns on evaluating an expression not ending in assignment, on evaluating a guarded expression, or after the last expression; a tradfn returns on <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="kd">→</span></code> (goto) line 0 or a non-existing line, or on evaluating a <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">:</span><span class="nv">Return</span></code> control structure, or after the last line.</li>
<li>The simpler flow control in a dfn makes it easier to detect and implement <a href="Tail_call" title="Tail call">tail recursion</a> than in a tradfn.</li>
<li>A dfn may call a tradfn and <i>vice versa</i>; a dfn may be defined in a tradfn, and <i>vice versa</i>.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Kenneth E. Iverson</a>, the inventor of APL, was dissatisfied with the way user functions (tradfns) were defined. In 1974, he devised "formal function definition" or "direct definition" for use in exposition.<sup id="cite_ref-directdef_20-0" class="reference"><a href="#cite_note-directdef-20"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup> A direct definition has two or four parts, separated by colons:
</p>
<div class="mw-highlight mw-highlight-lang-apl mw-content-ltr" dir="ltr"><pre><span class="nv">name</span><span class="w"> </span><span class="bp">:</span><span class="w"> </span><span class="nv">expression</span>
<span class="nv">name</span><span class="w"> </span><span class="bp">:</span><span class="w"> </span><span class="nv">expression0</span><span class="w"> </span><span class="bp">:</span><span class="w"> </span><span class="nv">proposition</span><span class="w"> </span><span class="bp">:</span><span class="w"> </span><span class="nv">expression1</span>
</pre></div>
<p>Within a direct definition, <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍺</span></code> denotes the left argument and <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="bp">⍵</span></code> the right argument. In the first instance, the result of <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">expression</span></code> is the result of the function; in the second instance, the result of the function is that of <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">expression0</span></code> if <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">proposition</span></code> evaluates to 0, or <code class="mw-highlight mw-highlight-lang-apl mw-content-ltr" style="" dir="ltr"><span class="nv">expression1</span></code> if it evaluates to 1. Assignments within a direct definition are <a href="Scope_(computer_science)#Dynamic_scoping" title="Scope (computer science)">dynamically local</a>. Examples of using direct definition are found in the 1979 <a href="Turing_Award" title="Turing Award">Turing Award</a> Lecture<sup id="cite_ref-TOT_21-0" class="reference"><a href="#cite_note-TOT-21"><span class="cite-bracket">[</span>21<span class="cite-bracket">]</span></a></sup> and in books and application papers.<sup id="cite_ref-Iverson1976_22-0" class="reference"><a href="#cite_note-Iverson1976-22"><span class="cite-bracket">[</span>22<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Orth1976_23-0" class="reference"><a href="#cite_note-Orth1976-23"><span class="cite-bracket">[</span>23<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Hui1987_24-0" class="reference"><a href="#cite_note-Hui1987-24"><span class="cite-bracket">[</span>24<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-McDonnell1987_25-0" class="reference"><a href="#cite_note-McDonnell1987-25"><span class="cite-bracket">[</span>25<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-APL1978_9-3" class="reference"><a href="#cite_note-APL1978-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p><p>Direct definition was too limited for use in larger systems. The ideas were further developed by multiple authors in multiple works<sup id="cite_ref-opfns_26-0" class="reference"><a href="#cite_note-opfns-26"><span class="cite-bracket">[</span>26<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §8">: §8 </span></sup><sup id="cite_ref-IversonWooster1981_27-0" class="reference"><a href="#cite_note-IversonWooster1981-27"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Cheney_28-0" class="reference"><a href="#cite_note-Cheney-28"><span class="cite-bracket">[</span>28<span class="cite-bracket">]</span></a></sup><sup class="reference nowrap"><span title="Page / location: §4.17">: §4.17 </span></sup><sup id="cite_ref-ratapl_29-0" class="reference"><a href="#cite_note-ratapl-29"><span class="cite-bracket">[</span>29<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-dictionary_30-0" class="reference"><a href="#cite_note-dictionary-30"><span class="cite-bracket">[</span>30<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Bunda1987_31-0" class="reference"><a href="#cite_note-Bunda1987-31"><span class="cite-bracket">[</span>31<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-J_32-0" class="reference"><a href="#cite_note-J-32"><span class="cite-bracket">[</span>32<span class="cite-bracket">]</span></a></sup> but the results were unwieldy. Of these, the "alternative APL function definition" of Bunda in 1987<sup id="cite_ref-Bunda1987_31-1" class="reference"><a href="#cite_note-Bunda1987-31"><span class="cite-bracket">[</span>31<span class="cite-bracket">]</span></a></sup> came closest to current facilities, but is flawed in conflicts with existing symbols and in error handling which would have caused practical difficulties, and was never implemented. The main distillates from the different proposals were that (a) the function being defined is anonymous, with subsequent naming (if required) being effected by assignment; (b) the function is denoted by a symbol and thereby enables <a href="Anonymous_recursion" title="Anonymous recursion">anonymous recursion</a>.<sup id="cite_ref-APL1978_9-4" class="reference"><a href="#cite_note-APL1978-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p><p>In 1996, <a href="John_M._Scholes" title="John M. Scholes">John Scholes</a> of Dyalog Limited invented direct functions (dfns).<sup id="cite_ref-Scholes1996_1-1" class="reference"><a href="#cite_note-Scholes1996-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2018v_6-1" class="reference"><a href="#cite_note-Scholes2018v-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2018t_7-1" class="reference"><a href="#cite_note-Scholes2018t-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> The ideas originated in 1989 when he read a special issue of <i><a href="The_Computer_Journal" title="The Computer Journal">The Computer Journal</a></i> on functional programming.<sup id="cite_ref-Wadler_33-0" class="reference"><a href="#cite_note-Wadler-33"><span class="cite-bracket">[</span>33<span class="cite-bracket">]</span></a></sup> He then proceeded to study functional programming and became strongly motivated ("sick with desire", like <a href="W._B._Yeats" title="W. B. Yeats">Yeats</a>) to bring these ideas to APL.<sup id="cite_ref-Scholes2018v_6-2" class="reference"><a href="#cite_note-Scholes2018v-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Scholes2018t_7-2" class="reference"><a href="#cite_note-Scholes2018t-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> He initially operated in stealth because he was concerned the changes might be judged too radical and an unnecessary complication of the language; other observers say that he operated in stealth because Dyalog colleagues were not so enamored and thought he was wasting his time and causing trouble for people. Dfns were first presented in the Dyalog Vendor Forum at the APL '96 Conference and released in Dyalog APL in early 1997.<sup id="cite_ref-Scholes1996_1-2" class="reference"><a href="#cite_note-Scholes1996-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> Acceptance and recognition were slow in coming. As late as 2008, in <i>Dyalog at 25</i>,<sup id="cite_ref-Dyalog@25_34-0" class="reference"><a href="#cite_note-Dyalog@25-34"><span class="cite-bracket">[</span>34<span class="cite-bracket">]</span></a></sup> a publication celebrating the 25th anniversary of Dyalog Limited, dfns were barely mentioned (mentioned twice as "dynamic functions" and without elaboration). As of 2019, dfns are implemented in Dyalog APL,<sup id="cite_ref-Dyalog17.1_19-2" class="reference"><a href="#cite_note-Dyalog17.1-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup> NARS2000,<sup id="cite_ref-NARS2000_35-0" class="reference"><a href="#cite_note-NARS2000-35"><span class="cite-bracket">[</span>35<span class="cite-bracket">]</span></a></sup> and ngn/apl.<sup id="cite_ref-Nickolov2013_36-0" class="reference"><a href="#cite_note-Nickolov2013-36"><span class="cite-bracket">[</span>36<span class="cite-bracket">]</span></a></sup> They also play a key role in efforts to exploit the computing abilities of a <a href="Graphics_processing_unit" title="Graphics processing unit">graphics processing unit</a> (GPU).<sup id="cite_ref-Hsu2019_37-0" class="reference"><a href="#cite_note-Hsu2019-37"><span class="cite-bracket">[</span>37<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-APL1978_9-5" class="reference"><a href="#cite_note-APL1978-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-Scholes1996-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-Scholes1996_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Scholes1996_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Scholes1996_1-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFScholes1996" class="citation journal cs1">Scholes, John (October 1996). <a rel="nofollow" class="external text" href="http://www.dyalog.com/uploads/documents/Papers/dfns.pdf">"Direct Functions in Dyalog APL"</a> <span class="cs1-format">(PDF)</span>. <i>Vector</i>. <b>13</b> (2)<span class="reference-accessdate">. Retrieved <span class="nowrap">16 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-refcard-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-refcard_2-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes1998–2019" class="citation cs2">Scholes, John (1998–2019), <a rel="nofollow" class="external text" href="http://dfns.dyalog.com/n_refcard"><i>Direct Functions Reference Card</i></a><span class="reference-accessdate">, retrieved <span class="nowrap">26 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-Scholes2001a-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-Scholes2001a_3-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes2001" class="citation journal cs1">Scholes, John (April 2001). <a rel="nofollow" class="external text" href="http://archive.vector.org.uk/art10007770">"D: A Functional Subset of Dyalog APL"</a>. <i>Vector</i>. <b>17</b> (4)<span class="reference-accessdate">. Retrieved <span class="nowrap">21 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-Scholes2009b-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-Scholes2009b_4-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes2009" class="citation audio-visual cs1">Scholes, John (13 September 2009). <a rel="nofollow" class="external text" href="https://www.youtube.com/watch?v=OZARVrGQQho"><i>Introduction to D-functions: 1 of 2</i></a> (video). Dyalog '09 User Conference<span class="reference-accessdate">. Retrieved <span class="nowrap">21 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-Scholes2009c-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-Scholes2009c_5-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes2009" class="citation audio-visual cs1">Scholes, John (13 September 2009). <a rel="nofollow" class="external text" href="https://www.youtube.com/watch?v=RQNSe9s_3eE"><i>Introduction to D-functions: 2 of 2</i></a> (video). Dyalog '09 User Conference<span class="reference-accessdate">. Retrieved <span class="nowrap">21 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-Scholes2018v-6"><span class="mw-cite-backlink">^ <a href="#cite_ref-Scholes2018v_6-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Scholes2018v_6-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Scholes2018v_6-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFScholes2018" class="citation audio-visual cs1">Scholes, John (31 October 2018). <a rel="nofollow" class="external text" href="https://www.youtube.com/watch?v=y33XDD6ANt0"><i>Dfns—Past, Present and Future</i></a> (video). Dyalog '18 User Meeting<span class="reference-accessdate">. Retrieved <span class="nowrap">21 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-Scholes2018t-7"><span class="mw-cite-backlink">^ <a href="#cite_ref-Scholes2018t_7-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Scholes2018t_7-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Scholes2018t_7-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFScholes2018" class="citation cs2">Scholes, John (31 October 2018), <a rel="nofollow" class="external text" href="http://www.dyalog.com/uploads/conference/dyalog18/presentations/D10_Dfns_Past_Present_Future.pdf"><i>Dfns—Past, Present and Future (text)</i></a> <span class="cs1-format">(PDF)</span>, Dyalog '18 User Meeting<span class="reference-accessdate">, retrieved <span class="nowrap">21 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-dfnsWS-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-dfnsWS_8-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes1998–2019" class="citation cs2">Scholes, John (1998–2019), <a rel="nofollow" class="external text" href="http://dfns.dyalog.com"><i>Direct Functions Workspace</i></a><span class="reference-accessdate">, retrieved <span class="nowrap">2019-09-15</span></span></cite></span>
</li>
<li id="cite_note-APL1978-9"><span class="mw-cite-backlink">^ <a href="#cite_ref-APL1978_9-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-APL1978_9-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-APL1978_9-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-APL1978_9-3"><sup><i><b>d</b></i></sup></a> <a href="#cite_ref-APL1978_9-4"><sup><i><b>e</b></i></sup></a> <a href="#cite_ref-APL1978_9-5"><sup><i><b>f</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFHuiKromberg2020" class="citation journal cs1">Hui, Roger; Kromberg, Morten (June 2020). <a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F3386319">"APL Since 1978"</a>. <i>Proceedings of the ACM on Programming Languages</i>. <b>4</b> (HOPL): <span class="nowrap">1–</span>108. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F3386319">10.1145/3386319</a></span>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:218517570">218517570</a>.</cite></span>
</li>
<li id="cite_note-history50-10"><span class="mw-cite-backlink">^ <a href="#cite_ref-history50_10-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-history50_10-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-history50_10-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-history50_10-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFHui2016" class="citation cs2"><a href="Roger_Hui" title="Roger Hui">Hui, Roger</a> (27 November 2016), <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/50"><i>A History of APL in 50 Functions</i></a><span class="reference-accessdate">, retrieved <span class="nowrap">17 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-Hui2016-11"><span class="mw-cite-backlink">^ <a href="#cite_ref-Hui2016_11-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Hui2016_11-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFHui2016" class="citation cs2"><a href="Roger_Hui" title="Roger Hui">Hui, Roger</a> (18 July 2016), <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/APL_exercises/"><i>APL Exercises</i></a><span class="reference-accessdate">, retrieved <span class="nowrap">24 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-MathWorld-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-MathWorld_12-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFWeisstein" class="citation cs2">Weisstein, Eric W., <a rel="nofollow" class="external text" href="http://mathworld.wolfram.com/BertelsensNumber.html"><i>Bertelsen's Number</i></a>, MathWorld, A Wolfram Web Resource<span class="reference-accessdate">, retrieved <span class="nowrap">26 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-fact-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-fact_13-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes1998–2019" class="citation cs2">Scholes, John (1998–2019), <a rel="nofollow" class="external text" href="http://dfns.dyalog.com/n_factorial.htm">"Factorial"</a>, <i>DFNS Workspace</i><span class="reference-accessdate">, retrieved <span class="nowrap">20 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-det-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-det_14-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFScholes1998–2019" class="citation cs2">Scholes, John (1998–2019), <a rel="nofollow" class="external text" href="http://dfns.dyalog.com/n_det.htm">"Determinant"</a>, <i>DFNS Workspace</i><span class="reference-accessdate">, retrieved <span class="nowrap">20 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-MathWorldP-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-MathWorldP_15-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFWeisstein" class="citation cs2">Weisstein, Eric W., <a rel="nofollow" class="external text" href="http://mathworld.wolfram.com/PartitionFunctionP.html"><i>Partition Function P, equation 11</i></a>, MathWorld, A Wolfram Web Resource<span class="reference-accessdate">, retrieved <span class="nowrap">3 October</span> 2019</span></cite></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><cite id="CITEREFHardyRamanujan1918" class="citation cs2">Hardy, G.H.; Ramanujan, S. (1918), <a rel="nofollow" class="external text" href="http://ramanujan.sirinudi.org/Volumes/published/ram36.pdf">"Asymptotic Formulæ in Combinatory Analysis"</a> <span class="cs1-format">(PDF)</span>, <i>Proceedings of the London Mathematical Society</i>, <b>17</b> (2)<span class="reference-accessdate">, retrieved <span class="nowrap">24 December</span> 2019</span></cite></span>
</li>
<li id="cite_note-AHU-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-AHU_17-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFAhoHopcroftUllman1974" class="citation cs2"><a href="Alfred_Aho" title="Alfred Aho">Aho, A.V.</a>; <a href="John_Hopcroft" title="John Hopcroft">Hopcroft, J.E.</a>; <a href="Jeffrey_Ullman" title="Jeffrey Ullman">Ullman, J.D.</a> (1974), <i>The Design and Analysis of Computer Algorithms</i>, Addison-Wesley, <a href="Bibcode_(identifier)" class="mw-redirect" title="Bibcode (identifier)">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/1974daca.book.....A">1974daca.book.....A</a></cite></span>
</li>
<li id="cite_note-Bentley1983-18"><span class="mw-cite-backlink"><b><a href="#cite_ref-Bentley1983_18-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFBentley1983" class="citation journal cs1">Bentley, Jon (August 1983). "Programming Pearls". <i><a href="Communications_of_the_ACM" title="Communications of the ACM">Communications of the ACM</a></i>. <b>26</b> (8 and 9).</cite></span>
</li>
<li id="cite_note-Dyalog17.1-19"><span class="mw-cite-backlink">^ <a href="#cite_ref-Dyalog17.1_19-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Dyalog17.1_19-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Dyalog17.1_19-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFDyalog2019" class="citation book cs1">Dyalog (15 August 2019). <a rel="nofollow" class="external text" href="http://docs.dyalog.com/17.0/Dyalog%20Programming%20Reference%20Guide.pdf"><i>Dyalog Programming Reference Guide, version 17.1, Dfns & Dops, pp. 133-147</i></a> <span class="cs1-format">(PDF)</span>. Dyalog Ltd<span class="reference-accessdate">. Retrieved <span class="nowrap">30 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-directdef-20"><span class="mw-cite-backlink"><b><a href="#cite_ref-directdef_20-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIverson1974" class="citation cs2"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a> (1974), <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/DirectDef.htm">"Chapter 10, Formal Function Definition"</a>, <i>Elementary Functions</i>, IBM Corporation<span class="reference-accessdate">, retrieved <span class="nowrap">18 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-TOT-21"><span class="mw-cite-backlink"><b><a href="#cite_ref-TOT_21-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIverson1980" class="citation journal cs1"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a> (August 1980). <a rel="nofollow" class="external text" href="https://www.jsoftware.com/papers/tot.htm">"Notation as a Tool of Thought"</a>. <i><a href="Communications_of_the_ACM" title="Communications of the ACM">Communications of the ACM</a></i>. <b>23</b> (8): <span class="nowrap">444–</span>465. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F358896.358899">10.1145/358896.358899</a></span><span class="reference-accessdate">. Retrieved <span class="nowrap">8 April</span> 2016</span>.</cite></span>
</li>
<li id="cite_note-Iverson1976-22"><span class="mw-cite-backlink"><b><a href="#cite_ref-Iverson1976_22-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIverson1976" class="citation book cs1"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a> (1976). <i>Elementary Analysis</i>. APL Press.</cite></span>
</li>
<li id="cite_note-Orth1976-23"><span class="mw-cite-backlink"><b><a href="#cite_ref-Orth1976_23-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFOrth1976" class="citation book cs1">Orth, D.L. (1976). <i>Calculus in a New Key</i>. APL Press.</cite></span>
</li>
<li id="cite_note-Hui1987-24"><span class="mw-cite-backlink"><b><a href="#cite_ref-Hui1987_24-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHui1987" class="citation journal cs1"><a href="Roger_Hui" title="Roger Hui">Hui, Roger</a> (May 1987). <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/from.htm">"Some Uses of { and }"</a>. <i>APL 87 Conference Proceedings</i><span class="reference-accessdate">. Retrieved <span class="nowrap">15 April</span> 2016</span>.</cite></span>
</li>
<li id="cite_note-McDonnell1987-25"><span class="mw-cite-backlink"><b><a href="#cite_ref-McDonnell1987_25-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFMcDonnell1987" class="citation cs2">McDonnell, E.E. (May 1987), <a rel="nofollow" class="external text" href="http://www.jsoftware/papers/EEM/life.htm">"Life: Nasty, Brutish, and Short"</a>, <i>APL 87 Conference Proceedings</i><span class="reference-accessdate">, retrieved <span class="nowrap">6 October</span> 2019</span></cite></span>
</li>
<li id="cite_note-opfns-26"><span class="mw-cite-backlink"><b><a href="#cite_ref-opfns_26-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIverson1978" class="citation cs2"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a> (26 April 1978), <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/opfns.htm">"Operators and Functions"</a>, <i>Research Report Number #RC7091</i>, IBM Corporation<span class="reference-accessdate">, retrieved <span class="nowrap">2019-09-19</span></span></cite></span>
</li>
<li id="cite_note-IversonWooster1981-27"><span class="mw-cite-backlink"><b><a href="#cite_ref-IversonWooster1981_27-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIversonWooster1981" class="citation journal cs1"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a>; Wooster, Peter (September 1981). "A Function Definition Operator". <i>APL81 Conference Proceedings, APL Quote Quad</i>. <b>12</b> (1).</cite></span>
</li>
<li id="cite_note-Cheney-28"><span class="mw-cite-backlink"><b><a href="#cite_ref-Cheney_28-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFCheney1981" class="citation cs2">Cheney, Carl M. (March 1981), <a rel="nofollow" class="external text" href="http://www.sudleyplace.com/APL/Nested%20Arrays%20System.pdf"><i>APL*Plus Nested Array System Reference Manual</i></a> <span class="cs1-format">(PDF)</span>, <a href="Scientific_Time_Sharing_Corporation" title="Scientific Time Sharing Corporation">STSC, Inc.</a><span class="reference-accessdate">, retrieved <span class="nowrap">18 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-ratapl-29"><span class="mw-cite-backlink"><b><a href="#cite_ref-ratapl_29-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIverson1983" class="citation cs2"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a> (6 January 1983), <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/RationalizedAPL.htm"><i>Rationalized APL</i></a>, <a href="I._P._Sharp_Associates" title="I. P. Sharp Associates">I. P. Sharp Associates</a><span class="reference-accessdate">, retrieved <span class="nowrap">2019-09-19</span></span></cite></span>
</li>
<li id="cite_note-dictionary-30"><span class="mw-cite-backlink"><b><a href="#cite_ref-dictionary_30-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFIverson1987" class="citation journal cs1"><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Iverson, Kenneth E.</a> (September 1987). <span class="id-lock-subscription" title="Paid subscription required"><a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/APLDictionary.htm">"A Dictionary of APL"</a></span>. <i>APL Quote Quad</i>. <b>18</b> (1): <span class="nowrap">5–</span>40. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F36983.36984">10.1145/36983.36984</a>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:18301178">18301178</a><span class="reference-accessdate">. Retrieved <span class="nowrap">19 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-Bunda1987-31"><span class="mw-cite-backlink">^ <a href="#cite_ref-Bunda1987_31-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Bunda1987_31-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFBunda1987" class="citation journal cs1">Bunda, John (May 1987). "APL Function Definition Notation". <i>APL87 Conference Proceedings, APL Quote Quad</i>. <b>17</b> (4).</cite></span>
</li>
<li id="cite_note-J-32"><span class="mw-cite-backlink"><b><a href="#cite_ref-J_32-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHui1990" class="citation book cs1"><a href="Roger_Hui" title="Roger Hui">Hui, Roger</a>; et al. (July 1990). <a rel="nofollow" class="external text" href="http://www.jsoftware.com/papers/J1990.htm">"APL\?"</a>. <i>Conference proceedings on APL 90: For the future</i>. Vol. 20. pp. <span class="nowrap">192–</span>200. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F97808.97845">10.1145/97808.97845</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <bdi>089791371X</bdi>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:235453656">235453656</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2019-09-10</span></span>.</cite></span>
</li>
<li id="cite_note-Wadler-33"><span class="mw-cite-backlink"><b><a href="#cite_ref-Wadler_33-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFWadler1989" class="citation journal cs1">Wadler, Philip L.; et al. (1 January 1989). "Special Issue on Functional Programming". <i><a href="The_Computer_Journal" title="The Computer Journal">The Computer Journal</a></i>. <b>32</b> (2).</cite></span>
</li>
<li id="cite_note-Dyalog@25-34"><span class="mw-cite-backlink"><b><a href="#cite_ref-Dyalog@25_34-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFDyalog2008" class="citation journal cs1">Dyalog (September 2008). <a rel="nofollow" class="external text" href="http://www.dyalog.com/uploads/documents/dyalog_25.pdf">"Dyalog at 25"</a> <span class="cs1-format">(PDF)</span>. <i>Vector</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2019-09-20</span></span>.</cite></span>
</li>
<li id="cite_note-NARS2000-35"><span class="mw-cite-backlink"><b><a href="#cite_ref-NARS2000_35-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFSmith2006–2019" class="citation cs2">Smith, Bob (2006–2019), <a rel="nofollow" class="external text" href="http://www.nars2000.org/"><i>NARS2000</i></a><span class="reference-accessdate">, retrieved <span class="nowrap">18 September</span> 2019</span></cite></span>
</li>
<li id="cite_note-Nickolov2013-36"><span class="mw-cite-backlink"><b><a href="#cite_ref-Nickolov2013_36-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFNickolov2013" class="citation journal cs1">Nickolov, Nick (September 2013). <a rel="nofollow" class="external text" href="http://archive.vector.org.uk/art10501160">"Compiling APL to JavaScript"</a>. <i>Vector</i>. <b>26</b> (1)<span class="reference-accessdate">. Retrieved <span class="nowrap">19 September</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-Hsu2019-37"><span class="mw-cite-backlink"><b><a href="#cite_ref-Hsu2019_37-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHsu2019" class="citation thesis cs1">Hsu, Aaron (2019). <a rel="nofollow" class="external text" href="http://scholarworks.iu.edu/dspace/bitstream/handle/2022/24749/Hsu%20Dissertation.pdf"><i>A Data Parallel Compiler Hosted on a GPU</i></a> <span class="cs1-format">(PDF)</span> (Ph.D. thesis). <a href="Indiana_University" title="Indiana University">Indiana University</a><span class="reference-accessdate">. Retrieved <span class="nowrap">25 December</span> 2019</span>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><span class="official-website"><span class="url"><a rel="nofollow" class="external text" href="http://dfns.dyalog.com">Official website</a></span></span>, Dyalog</li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="APL_programming493" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="3"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div id="APL_programming493" style="font-size:114%;margin:0 4em"><a href="APL_(programming_language)" title="APL (programming language)">APL programming</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Features</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="APL_syntax_and_symbols" title="APL syntax and symbols">APL syntax and symbols</a></li>
<li> (dfn)</li>
<li><a href="Digital_encoding_of_APL_symbols" title="Digital encoding of APL symbols">Code pages</a></li>
<li><a href="Iverson_bracket" title="Iverson bracket">Iverson bracket</a></li>
<li><a href="Rank_(J_programming_language)" title="Rank (J programming language)">Rank</a></li>
<li><a href="Shared_Variables" title="Shared Variables">Shared Variables</a></li></ul>
</div></td><td class="noviewer navbox-image" rowspan="3" style="width:1px;padding:0 0 0 2px"><div><span typeof="mw:File"></span></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Programming_language_implementation" title="Programming language implementation">Implementations</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%">Major</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li>Dyalog APL</li>
<li>APL2 → <i>APLX</i></li>
<li><i>SHARP APL</i></li>
<li><i>NARS</i> → NARS2000°</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Dialect_(computing)" class="mw-redirect" title="Dialect (computing)">Dialects</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="A%2B_(programming_language)" title="A+ (programming language)"><i>A</i> → <i>A+</i></a>°</li>
<li>APLNext → <i>VisualAPL</i></li>
<li><i><a href="ELI_(programming_language)" title="ELI (programming language)">ELI</a></i></li>
<li><i>GNU APL</i>°</li>
<li><a href="J_(programming_language)" title="J (programming language)">J</a>°</li>
<li><a href="Kdb%2B" title="Kdb+">kdb+</a>
<ul><li><a href="K_(programming_language)" title="K (programming language)">K</a>, <a href="Q_(programming_language_from_Kx_Systems)" title="Q (programming language from Kx Systems)">Q</a></li></ul></li>
<li><i><a href="Polymorphic_Programming_Language" title="Polymorphic Programming Language">Polymorphic Programming Language</a></i> (PPL)</li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Community_of_practice" title="Community of practice">Community</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Professional_association" title="Professional association">Professional<br>associations</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Association_for_Computing_Machinery" title="Association for Computing Machinery">Association for Computing Machinery</a>: SIGAPL</li>
<li>British APL Association</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Organizations</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%">Business</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Ampere_WS-1" title="Ampere WS-1">Ampere</a></li>
<li>Analogic Corporation</li>
<li>APL2000</li>
<li><a href="CompuServe" title="CompuServe">CompuServe</a></li>
<li><a href="Digital_Equipment_Corporation" title="Digital Equipment Corporation">Digital Equipment Corporation</a> (DEC)</li>
<li>DNA Systems</li>
<li>Dyalog Ltd.</li>
<li><a href="IBM" title="IBM">IBM</a></li>
<li><a href="I._P._Sharp_Associates" title="I. P. Sharp Associates">I. P. Sharp Associates</a></li>
<li><a href="Kx_Systems" class="mw-redirect" title="Kx Systems">Kx Systems</a></li>
<li><a href="MCM/70" title="MCM/70">Micro Computer Machines</a> (MCM)</li>
<li><a href="Science_Research_Associates" title="Science Research Associates">Science Research Associates</a></li>
<li><a href="Scientific_Time_Sharing_Corporation" title="Scientific Time Sharing Corporation">Scientific Time Sharing Corporation</a> (STSC)</li>
<li><a href="Soliton_Incorporated" title="Soliton Incorporated">Soliton Incorporated</a></li>
<li>Telecompute Integrated Systems, Inc.</li>
<li>Time Sharing Resources (TSR)</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Education</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Carnegie_Mellon_University" title="Carnegie Mellon University">Carnegie Mellon University</a> (CMU)</li>
<li><a href="University_of_Maryland%2C_College_Park" title="University of Maryland, College Park">University of Maryland</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">People</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Philip_S._Abrams" title="Philip S. Abrams">Phil Abrams</a></li>
<li><a href="Robert_Bernecky" title="Robert Bernecky">Bob Bernecky</a></li>
<li><a href="Lawrence_M._Breed" title="Lawrence M. Breed">Larry Breed</a></li>
<li><a href="Charles_Brenner_(mathematician)" title="Charles Brenner (mathematician)">Charles Brenner</a></li>
<li><a href="Fred_Brooks" title="Fred Brooks">Fred Brooks</a></li>
<li><a href="Jim_Brown_(computer_scientist)" title="Jim Brown (computer scientist)">Jim Brown</a></li>
<li><a href="Adin_Falkoff" title="Adin Falkoff">Adin Falkoff</a></li>
<li>Patrick E. Hagerty</li>
<li>Herbert Hellerman</li>
<li><a href="Roger_Hui" title="Roger Hui">Roger Hui</a></li>
<li><a href="Kenneth_E._Iverson" title="Kenneth E. Iverson">Kenneth E. Iverson</a></li>
<li><a href="Richard_H._Lathwell" title="Richard H. Lathwell">Dick Lathwell</a></li>
<li><a href="Eugene_McDonnell" title="Eugene McDonnell">Eugene McDonnell</a></li>
<li>Robert Metzger</li>
<li><a href="Roger_Moore_(computer_scientist)" title="Roger Moore (computer scientist)">Roger Moore</a></li>
<li><a href="Alan_Perlis" title="Alan Perlis">Alan Perlis</a></li>
<li><a href="John_M._Scholes" title="John M. Scholes">John Scholes</a></li>
<li>J. Henri Schueler</li>
<li>Bob Smith</li>
<li><a href="Edward_H._Sussenguth" title="Edward H. Sussenguth">Edward H. Sussenguth</a> Jr.</li>
<li><a href="Arthur_Whitney_(computer_scientist)" title="Arthur Whitney (computer scientist)">Arthur Whitney</a></li>
<li>William Yerazunis</li>
<li><a href="Rodnay_Zaks" title="Rodnay Zaks">Rodnay Zaks</a></li></ul>
</div></td></tr><tr><td colspan="2" class="navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Iverson_Award" title="Iverson Award">Iverson Award</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><td class="navbox-abovebelow" colspan="3"><div>
<ul><li><i>Italics</i> <b>= discontinued</b></li>
<li><b>° = <a href="Open-source_software" title="Open-source software">Open-source software</a></b><br><span class="noviewer" typeof="mw:File"><span title="Commons page"></span></span> <b><a href="https://commons.wikimedia.org/wiki/Category:APL_(programming_language)" class="extiw external" title="commons:Category:APL (programming language)">Commons</a></b> <span class="noviewer" typeof="mw:File"><span title="Category"></span></span> <b>Category</b></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-28" href="https://en.wikipedia.org/wiki/?title=Direct_function&oldid=1292720546">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>